Hash.default-based euler code is slower under JRuby than Ruby 1.9.1
-------------------------------------------------------------------
Key: JRUBY-3315
URL: http://jira.codehaus.org/browse/JRUBY-3315
Project: JRuby
Issue Type: Bug
Components: Performance
Reporter: Charles Oliver Nutter
This code runs slower under JRuby than under 1.9.1. Have not done much
investigation so far.
{noformat}
#!/usr/bin/env jruby
#!/usr/bin/env ruby1.9
# This is quite elegant (IMO), but also VERY slow under MRI 1.8. Run
# under jruby or ruby1.9!
# The problem:
#
# If a number is even, divide it by two; if it is odd, multiply by
# three and add one. So if we start with the number 13, the sequence
# goes 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1. This
# "chain" is 10 links long. (Sequence ends when you reach 1).
#
# Project Euler #14 wants to know: what number, less than 1_000_000,
# generates the longest chain? (Later numbers in the chain can go over
# 1M, but the first number must be <= 1M.)
# Here's my solution; I am trying for elegant/readable/tight/clean
# code.
h = Hash.new {|h,k| h[k] = (1 + ((k % 2 == 0) ? h[k/2] : h[3*k+1])) }
h[1] = 1
puts m = (1..1000000).map {|i| h[i]}.max
# This runs in about 100s on Ruby 1.8.
#
# - Initting a hash with a proc is elegant and clean, but slow. It
# went from 100s -> 16s after I wrote code to cache the results by
# hand.
#
# - Looping with downto instead of using map/max prevents duplication
# of the array. This results in another 16s -> 4s speed impromevent.
#
# - Interestingly, in the hash init proc, I noticed that h might be
# aliasing to the external h variable, so I changed the inner
# variables to |hash,key|. It certainly did have an effect: this
# *added* 20sec to the execution time. Curious.
{noformat}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email