Ruby vs Java:为什么Java会让世界变得更快?

我用Honoi Tower的经典例子测试了递归方法的执行速度。

首先在Java中比JRuby和Ruby不同。 板块:

package com.example;

public class Hanoi {

  public static void main(String[] args) {      
    int [] plates = {25, 26, 27, 28, 29, 30, 31, 32};
    for(int i = 0; i < plates.length; i++){
        long start = System.currentTimeMillis();
        doTowers(plates[i], 'A', 'B', 'C');
        System.out.println(System.currentTimeMillis() - start);
    }
  }

  public static void doTowers(int topN, char from, char inter, char to) {
    if (topN == 1) {
      //NOP
    } else {
      doTowers(topN - 1, from, to, inter);
      doTowers(topN - 1, inter, from, to);
    }
  }

}

结果是:

Java(millis)   JRuby(sec)   Ruby(sec)    Ruby(sec)   Ruby(sec)   
java 7         jruby-1.7.9  jruby-1.7.9  ruby-2.1.3  ruby-2.1.3 {tailcall_optimization: true}

364            0.269        3.395        6.160       5.515
380            0.321        6.288        12.401      11.082
1349           1.173        13.462       25.497      22.661
2328           1.25         25.714       50.223      44.494
4674           4.73         51.159       101.825     89.22
4995           5.014        103.252      200.308     177.034
18633          18.637       208.356      411.667     357.561
19978          20.927       421.86       805.138     711.872

看起来像在java上运行,jruby具有相同的性能。

  • 这是关于JVM的吗? 还是红宝石只使用单机的核心?
  • Ruby中这种非线性性能损失的原因是什么?
  • 红宝石2有什么问题?
  • EDITED

    添加了带有{tailcall_optimization:true}的Ruby 2.1.3的结果。 正如你现在所看到的那样,使用默认的假选项会更快。

    还有一个问题

  • 为什么Ruby代码在jruby(它当前加载ruby 1.9)上运行速度比在ruby 2.1.3上快? ruby代码是否编译并运行在jvm上?
  • Ruby和JRuby的实现如下:

    class Hanoi
    
      def do_towers(top_n, from, inter, to)
        if top_n == 1
          #NOP
        else
          do_towers top_n - 1, from, to, inter
          do_towers top_n - 1, inter, from, to
        end
      end
    end
    
    [25, 26, 27, 28, 29, 30, 31, 32].each do |plate|
      start = Time.now
      HanoiRb.new.do_towers plate, 'A', 'B', 'C'
      puts Time.now - start
    end
    

    JRuby的:

    include Java
    $CLASSPATH << 'lib'
    
    Hanoi = JavaUtilities.get_proxy_class('com.example.Hanoi')
    
    [25, 26, 27, 28, 29, 30, 31, 32].each do |plate|
      start = Time.now
      Hanoi.doTowers(plate, 'A'.to_java.toCharArray[0], 'B'.to_java.toCharArray[0], 'C'.to_java.toCharArray[0])
      puts Time.now - start
    end
    

    这是关于JVM的吗?

    这就是你的结果所暗示的。 JVM会大量优化代码。

    还是红宝石只使用单机的核心?

    您的Java程序似乎也只使用一个内核,所以这并不重要。

    Ruby中这种非线性性能松动的原因是什么?

    Ruby中的性能看起来与移动所有平板所需的工作量成线性关系。 Java的更令人惊讶。

    JVM不会执行尾部调用优化,因此如果您在代码中执行此操作将会很有趣。

    链接地址: http://www.djcxy.com/p/24087.html

    上一篇: Ruby vs Java: Why world is going to end faster with Java?

    下一篇: Docker: Which approach is better? WAR embedded in image or base image + war?