Ruby的表现优于Java

时间:2015-09-17 19:07:08

标签: java ruby performance benchmarking

我正在做一个针对Java群体的Ruby生态系统的演示文稿。

即使我会从生产力中获得关于时间收益的观点,并且更慢仍然可以足够快,如果我能想出一个基准,那将会很好这表明Ruby在某种数字处理方面胜过Java,一旦问题出现,为了双关语。

<小时/> 不幸的是,经过数小时的搜索和实验,我仍然一无所获。

有人能想出一个显示事物并非完全黑白的基准吗?

理想情况下,它应该将最新版本的 java 1.6 / 1.8 与最新版本的 cruby 进行比较。任何涉及 rubinius / jruby 的例子也会受到赞赏。

3 个答案:

答案 0 :(得分:14)

我不认为你会找到一些东西。在优化方面,Ruby和Java实际上非常相似,两者的主要难点是盒装对象和动态方法分派,它们都是从Smalltalk(Ruby直接,Java通过其main inspiration Objective-C)继承而来。 Java虚拟机非常简单,是动态调度的OO语言最先进的生产执行环境。例如,对于Scheme可能有一些研究内容甚至更快,但是当涉及到生产就绪的工业强度实施时,Azul ZingOracle HotSpotOracle JRockit,{{ 3}}和朋友们一起赢得胜利。

所以,除非IBM J9人发明了Smalltalk / Java社区忽略的东西,否则你最多只能获得相同的性能。

你最好的选择是不是数字处理,而是文本处理。这是Ruby的Perl遗产闪耀的东西。大多数Java实现&#39;正则表达式引擎并不是非常高效(尽管它们越来越好),而Rubinius实际上非常好(不如Perl那么好)。此外,Ruby的字符编码独立字符串允许您消除对字符串的重新编码,而Java的字符串将始终必须与UTF-16进行编码,除非输入和输出编码是UTF -16,这是不太可能的。在Ruby中,您需要最多转码一次,即使您的输入和输出编码不同,您也可以将内部编码设置为与输入或输出编码相同,因此您只需在输入期间进行转码或输出,但不是两者。

然而,的例子,Ruby与C竞争,并且因为&#34;每个人都知道C#比Java快,这肯定意味着Ruby比Java,对吗? 从右吗

[实际上,找到Ruby优于C的示例可能更容易,因为动态优化,如推测内联,多态内联缓存,自适应优化,以及&#34;不安全&#34;通过动态去优化实现的优化不存在于典型的C实现中。]

特别是,用Ruby编写的Rubinius Onigmo并不比用C语言编写的Hash class类慢得多。

一个非常令人兴奋的例子是YARV's Hash可以在JVM (!!!)之上的C解释器中运行YARV C扩展,这比YARV本身可以运行C扩展更快:

[当然,后一个例子实际上是High-Performance Cross-Language Interoperability in a Multi-Language Runtime by Matthias Grimmer, Chris Seaton, Roland Schatz, Thomas Wuerthinger, Hanspeter Mössenböck, in Proceedings of 11th Dynamic Languages Symposium (DLS)Truffle的力量的一个例子,即两种Java技术,而不仅仅是Ruby的力量的一个例子。]

答案 1 :(得分:2)

我最终会使用一个简单的正则表达式示例 - /(foo|bar)*/,尝试匹配'foobar' * n

puts 'Done matching' if ('foobar' * 666).match(/(foo|bar)*/)

VS

import java.util.Collections;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class SimpleRegexTester {
    public static void main(String[] args) {
        String repeatedFooBar = String.join("", Collections.nCopies(666, "foobar"));
        Pattern p = Pattern.compile("(foo|bar)*");
        Matcher m = p.matcher(repeatedFooBar);

        if (m.matches())
            System.out.println("Done matching");
    }
}

技术上并不快, java 版本甚至不起作用(抛出StackOverflowError)。对于 java 更好地针对每种可能的场景进行优化的概念,这个恕我直言是非常优越的。

它还为我提供了一个很好的转换,可以谈论代码的简洁性,特别是在我展示了 java8 版本之后。

答案 2 :(得分:0)

我曾经参加过JRuby开发人员的演讲,他指出他们从JRuby获得的基准测试比从本地Ruby获得更好的基准测试,这是因为Sun / Oracle花费了大量资金使Hotspot非常擅长JIT优化

我怀疑你可能能找到一些基准,其中JRuby和普通Java一样快,一旦JIT有机会发挥它的魔力。

因此,在开始衡量性能之前,尝试一个服务器应用程序,可能是一个Web应用程序,启动它并至少运行一次代码。这应该意味着JIT已经发生,您可能会发现性能等同于普通Java。

即便如此,拖拉机也不是赛车。一个人擅长赢得比赛,另一个人擅长拉犁。同样,有多种原因存在多种语言。