#424: performance regression from ruby 1.8 and 1.9 -------------------------------------+-------------------------------------- Reporter: jordan.breeding@… | Owner: lsansonetti@… Type: defect | Status: new Priority: blocker | Milestone: Component: MacRuby | Keywords: -------------------------------------+-------------------------------------- Comment(by jordan.breeding@…): Well, unless I am losing my mind it must be something to do with iterating over things in MacRuby. I say this because even in the example below the amount of nodes being pushed onto the queue should be dominated by all of the other work going on, almost eliminating performance differences of the queue itself. {{{ 57 jordan@thetourist ~/priority_queue_bug > for LOOP in search.*; do eval time macruby "${LOOP}" -c -m a-star input_files/input13_1.txt >/dev/null; done macruby search.cocoa -c -m a-star input_files/input13_1.txt 33.69s user 1.58s system 182% cpu 19.363 total macruby search.pqueue -c -m a-star input_files/input13_1.txt 35.01s user 1.49s system 179% cpu 20.278 total }}} However, if I use two new scripts that are strictly adding a large amount of nodes the the queue the difference is greater, in this case the .pqueue file would still be taking the hit of iterating, etc. strictly on the MacRuby side (where MacRuby appears to be slower than 1.8 or 1.9), the .cocoa example ends up doing most of the heaving lifting in this case through CFBinaryHeap. Here are ruby, ruby1.9, and macruby using the .pqueue file: {{{ 62 jordan@thetourist ~/priority_queue_bug > for LOOP in ruby ruby1.9 macruby; do eval time "${LOOP}" ./speed_test.pqueue; done ruby ./speed_test.pqueue 82.38s user 3.10s system 96% cpu 1:28.39 total ruby1.9 ./speed_test.pqueue 55.25s user 3.02s system 99% cpu 58.845 total macruby ./speed_test.pqueue 69.08s user 11.54s system 47% cpu 2:49.53 total }}} Here is macruby using the .pqueue file and the .cocoa file: {{{ 63 jordan@thetourist ~/priority_queue_bug > for LOOP in speed_test.*; do eval time macruby "${LOOP}"; done macruby speed_test.cocoa 6.73s user 0.34s system 117% cpu 6.005 total macruby speed_test.pqueue 65.32s user 10.76s system 50% cpu 2:31.36 total }}} Here is the .pqueue file: {{{ #!/usr/bin/env ruby1.9 # put the directory this file is in into the search path so that we # can get ruby_priority_queue below $:.unshift(File.dirname($0)) require 'lib/revision' require 'lib/pqueue' if (Revision.new(RUBY_VERSION) < Revision.new("1.9")) class String def chars return self.split("") end end end class TestNode include Comparable attr_reader :priority def initialize(newPriority) $counter = $counter + 1 @priority = newPriority end def <=>(rhs) @priority <=> rhs.priority end def getChildren (@priority * 5).upto((@priority * 5) + 2).map { |childPriority| TestNode.new(childPriority) } end end $counter = 0 $searchQueue = PQueue.new $searchQueue.push(TestNode.new(0)) while ((currentNode = $searchQueue.pop) && ($counter < 250000)) do currentNode.getChildren.each { |child| $searchQueue.push(child) } end exit 0 }}} Here is the .cocoa file: {{{ #!/usr/bin/env macruby # put the directory this file is in into the search path so that we # can get ruby_priority_queue below $:.unshift(File.dirname($0)) require 'lib/revision' framework 'lib/JBBPriorityQueue.framework' if (Revision.new(RUBY_VERSION) < Revision.new("1.9")) class String def chars return self.split("") end end end class TestNode include Comparable attr_reader :priority def initialize(newPriority) $counter = $counter + 1 @priority = newPriority end def <=>(rhs) @priority <=> rhs.priority end def compareToNode(rhs) @priority <=> rhs.priority end def getChildren (@priority * 5).upto((@priority * 5) + 2).map { |childPriority| TestNode.new(childPriority) } end end $counter = 0 $searchQueue = JBBPriorityQueue.alloc.init $searchQueue.push(TestNode.new(0)) while ((currentNode = $searchQueue.pop) && ($counter < 250000)) do currentNode.getChildren.each { |child| $searchQueue.push(child) } end exit 0 }}} The library files are in the attached zip file already, these files were run from that directory. I will keep looking for other places in my main script that might have large differences between ruby, ruby1.9, and macruby. Please let me know if there is anything else I can specifically look for. -- Ticket URL: <http://www.macruby.org/trac/ticket/424#comment:3> MacRuby <http://macruby.org/>