为什么Ruby比Java慢得多?

时间:2015-01-04 16:11:55

标签: java ruby

当我偶然发现this problem时,我正在研究Project Euler问题。我编写了一个程序,可以在Ruby on Rails(语言新手)中正确解决它:

class Collatz
 def search
    counter = 0
    storage = 0
    amount = 0
    (1..1000000).each do |i| i += 1
      temp = i
      while temp != 1
        temp = temp & 1 == 1 ? 3 * temp + 1 : temp >> 1
        counter += 1
      end
      if counter > amount
        amount = counter
        storage = i
      end
      counter = 0
    end
    puts storage
  end
end

start = Time.now
collatz = Collatz.new
collatz.search
ending = Time.now
puts "Time: #{ending - start}"

我意识到需要很长时间,确切地说是15.185317秒。 但是,当我尝试Java时,时间要短得多:

public class Euler{

    private static void problem() {
        long a;
        int j;
        int max = 0;
        int maxnr = 0;
        for(int i = 1; i < 1000000; i++) {
            a = i;
            j = 1;
            while( a != 1 ) {
                a = ((a & 1) == 1) ? (3 * a + 1) : (a >> 1);
                j++;
            }
            if(j > max) {
                max = j;
                maxnr = i;
            }
        }
        System.out.println(maxnr);
    }

    public static void main(String[] args) {
        long ct = System.currentTimeMillis();
        problem();
        long nt = System.currentTimeMillis() - ct;
        System.out.println(nt);
}

最后这个程序耗时769毫秒。我使用RubyMine for Ruby和Intellij IDEA for Java。我似乎无法弄清楚为什么需要这么长时间,而且我不确定它是否正常。这项任务似乎并不太难,因为我只是在循环。

1 个答案:

答案 0 :(得分:3)

你对这个问题的解决方案很差。它涉及做大量的重复工作。显然,JVM在优化冗余工作方面要比Ruby好得多。

但是,如果您要编写一个明确使用以前工作的正确解决方案,您会发现如果您在Ruby或Java上运行它将无关紧要。您可以使用数组或映射来存储以前的结果。这种技术也称为动态编程。