gpt4 book ai didi

java - ruby 与 Java : Why world is going to end faster with Java?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:18 24 4
gpt4 key购买 nike

我用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上运行性能一样。

  1. 都是关于 JVM 的吗?还是 ruby​​ 只使用单核机器?
  2. Ruby 中这种非线性性能损失的原因是什么?
  3. ruby 2 有什么问题?

已编辑

使用 { tailcall_optimization: true } 添加了 Ruby 2.1.3 的结果.正如您现在所看到的,它比使用默认的 false 选项更快。

还有一个问题:

  1. 为什么 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

最佳答案

Is it all about JVM?

这就是您的结果所暗示的。 JVM 确实对代码进行了大量优化。

Or does ruby use only single core of machine?

您的 Java 程序似乎也只使用一个内核,所以这无关紧要。

What is the reason for this nonlinear performance loose in Ruby?

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

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

关于java - ruby 与 Java : Why world is going to end faster with Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com