是什么使Ruby慢? [关闭](What makes Ruby slow? [closed])

2019-06-23 13:48发布

Ruby是在某些事情慢。 但是,什么部位是最有问题?

多少垃圾回收影响性能? 我知道我已经运行时,垃圾收集单独服用几秒钟,尤其是OpenGL库工作时,有次。

我用用Ruby矩阵数学库,是特别慢。 有红宝石如何实现基本的数学问题?

是否有任何的Ruby的动态特性,根本无法有效地执行? 如果是这样,怎么其他语言,如Lua和Python的解决这些问题?

以前有已显著提高了性能最近的工作?

Answer 1:

Ruby是缓慢的。 但是,什么部位是最有问题?

它做“迟到查找”的方法,允许灵活性。 这减缓下来不少。 它还必须记住每个上下文变量名允许的eval,所以它的框架和方法调用速度较慢。 此外,它缺乏一个良好的JIT编译器目前,尽管MRI 1.9有一个字节码编译器(这是更好),和JRuby编译它归结为Java字节码,然后(可以)通过HotSpot JVM的JIT编译器编译,但它最终被约相同的速度1.9。

多少垃圾回收效果的表现? 我知道我已经运行时,垃圾收集单独服用几秒钟,尤其是OpenGL库工作时,有次。

从一些在图表的http://www.igvita.com/2009/06/13/profiling-ruby-with-googles-perftools/我会说这需要大约10%,这是相当多的-你可以通过增加gc.c和重新编译malloc_limit减少是命中。

我用用Ruby矩阵数学库,是特别慢。 有红宝石如何实现基本的数学问题?

红宝石1.8“没”实施基本数学它实现的数字类和你每次呼叫呼叫之类的东西#长整数+#长整数/次 - 这是缓慢的。 Ruby 1.9的内联通过一些基本的数学OPS的欺骗了一下。

是否有任何的Ruby的动态特性,根本无法有效地执行? 如果是这样,怎么其他语言,如Lua和Python的解决这些问题?

喜欢的eval东西很难有效实施,尽管还有很多工作可以做,我敢肯定。 Ruby的起脚,它已经适应了在另一个线程更改类自发的定义别人,所以它必须是非常保守的。

以前有已显著提高了性能最近的工作?

1.9就像是一个2倍的速度提升。 它也更节省空间。 JRuby是不断尝试提高速度明智[大概在GC比KRI花费更少的时间。 除此之外,我不知道的多,除了小爱好的事情,我一直在工作。 还要注意的是1.9的字符串是有时慢,因为编码友好的。



Answer 2:

Ruby是一种快速提供解决方案非常好。 越少,对提供快速解决方案。 这取决于你想解决什么样的问题。 我想起在90年代初的老的CompuServe MSBASIC论坛的讨论:当被问及这是更快的Windows开发,VB或C,通常的回答是“VB,由大约6个月”。

在其MRI 1.8的形式,Ruby是 - 比较 - 慢执行某些类型的计算密集型任务。 几乎任何解释语言以这种方式受到相较于最主流的编译语言。

原因有几个:有些很容易寻址(原始垃圾收集1.8,例如),有的少一些。

1.9解决了一些问题,但它可能会需要一段时间它变得普遍可用之前。 一些针对预先存在的运行时间,JRuby中,IronRuby的,磁悬浮例如,其他实施必须显著更快的潜力。

关于数学的表现,我也不会感到惊讶地看到相当缓慢吞吐量:这是你付出的任意精度的代价的一部分。 再次,选择你的问题。 我已经解决了70+ 项目欧拉在Ruby中的问题几乎无解超过分钟的车跑嘴皮子。 速度有多快,你需要它来运行和如何尽快你需要它?



Answer 3:

最有争议的部分是“每个人”。

奖励积分,如果说,“每个人”并没有真正使用的语言,永远。

说真的,1.9是更快,现在是看齐Python和JRuby是比Jython的速度更快。

垃圾收集器是无处不在; 例如,Java有一个,它是比C ++更快的动态内存处理。 红宝石没有为数字运算适合好; 但很少有语言,所以如果你有在你的程序的计算密集型部分在任何语言,你最好在C(Java是快速的数学重写他们由于其原始类型,但它付出高昂的代价对他们来说,他们显然# 1在最丑陋的语言的份)。

至于动态的特点:他们是不是很快,但没有他们的代码静态语言可以更慢; 例如Java会使用DSL使用XML配置,而不是红宝石的; 它很可能是因为慢XML解析是昂贵的。



Answer 4:

嗯 - 我在几年前进行的项目,我刮用Ruby性能桶,而我不知道,因为太大的改变。 现在它是买者自负 - 你必须知道不去做某些事情,并坦言游戏/实时应用将是其中之一(因为你提到的OpenGL)。

杀死交互性能的罪魁祸首是垃圾收集器-其他人在这里提到,Java和其他环境有垃圾收集过,但Ruby的有阻止世界跑。 也就是说,它必须停止运行您的程序,通过各种寄存器和存储器指针从头开始扫描,标志着这仍然在使用的内存,并免费休息。 该过程不能被中断,而出现这种情况,正如你可能已经注意到,可能需要几百毫秒。

它的频率和执行的长度成正比,你创建和销毁对象的数量,但除非你完全禁用它,你无法控制的。 我的经验是,有几个不理想的策略来消除我的红宝石动画循环:

  • GC.disable / GC.enable围绕关键动画循环,也许机会主义GC.start迫使它去的时候它不能做任何伤害。 (因为我当时的目标平台是一个64MB的Windows NT的机器,这导致系统出现内存不足的偶尔碰到但从根本上它是一个坏主意 - 除非你可以预先计算出你可能多少内存在此之前需要,你“重新冒着内存耗尽)
  • 减少对象的数量在创建这样GC少的工作要做(降低频率/其执行长)
  • 重写用C循环播放动画(一种逃避,而是一个我去!)

这些天,我大概也看的JRuby将作为一个运行时的工作,因为我相信它依赖于Java的更先进的垃圾收集器。

试图写在Ruby中TFTP服务器而回(是的,我挑了所有我的表现,关键项目最好的语言,这是只是一个实验)时,其他主要性能问题,我发现是基本的I / O。 绝对最简单的紧循环简单地以一个UDP数据包进行响应另一个contaning下一块的文件,一定是20倍左右比股票C版慢。 我怀疑有可能是一些改进,使周围存在使用低级别的IO(sysread执行等)为主,但进展缓慢可能只是在事实上不存在低级别的字节数据类型 - 每一个小读复制出成串。 这仅仅是猜测,虽然,我没有这个项目更进一步,但它警告我送行依靠活泼的I / O。

主要的速度最近有所增加,这已经上,虽然我不能完全跟上时代的这里,是虚拟机实现了重做为1.9,导致代码执行速度更快。 但是我不认为GC已经改变了,我敢肯定,没有什么新的I / O前面。 但我没有完全跟上时代的对出血边缘红宝石所以别人可能想在这里凑钱。



Answer 5:

史蒂夫·德科尔特:“在高级语言编写Mandelbrot集计算器就像是试图在公共汽车运行印地500”。

http://www.dekorte.com/blog/blog.cgi?do=item&id=4047

我建议学习各种工具,以便使用正确的工具作业。 这样做矩阵变换可以有效地利用高层次的API,它包装与算术密集型计算各地紧密的循环来完成。 看到了RubyInline宝石用于嵌入C或C ++代码转换成Ruby脚本的一个例子。

还有木卫一语言比Ruby的要慢得多,但它有效地呈现皮克斯电影,并通过使用SIMD加速性能优于矢量算术原料℃。

  • http://iolanguage.com
  • https://renderman.pixar.com/products/tools/it.html
  • http://iolanguage.com/scm/git/checkout/Io/docs/IoGuide.html#Primitives-Vector


Answer 6:

我认为你问,“什么倾向于特定技术在Ruby中是缓慢的。”

一个是对象实例化。 如果你正在做大量的它,你想看看减少的(合理)的方式,如使用轻量级的模式 ,即使内存使用是没有问题的。 在一个图书馆,让我重新设计它不被一遍又一遍地创造了许多非常相似的对象,我再次翻番图书馆的整体速度。



Answer 7:

1.9.1约快两倍,PHP,和一点点比Perl快,根据一些基准。

(更新:我的来源是这样 ( 截图 )我不知道他的来源是什么,虽然。)

Ruby是不慢。 旧的1.8,但目前的Ruby是不是。



Answer 8:

Ruby是缓慢的,因为它的目的是要优化经验的程序员,而不是程序的执行时间。 缓慢仅仅是一个是设计决策的症状。 如果你希望表现的乐趣,你应该使用不同的语言。 Ruby的不是一切。



Answer 9:

IMO,动态语言一般都慢。 他们在做一些运行时静态语言编制时间做。

语法检查,口译和喜欢的类型检查,转换。 这是不可避免的,因此红宝石比C / C ++ / Java的更慢,纠正我,如果我错了。



文章来源: What makes Ruby slow? [closed]