什么使Ruby变慢?

什么使Ruby变慢?,ruby,performance,garbage-collection,dynamic-languages,Ruby,Performance,Garbage Collection,Dynamic Languages,鲁比在某些事情上反应迟钝。但它的哪些部分是最有问题的 垃圾收集器对性能的影响有多大?我知道我曾经有过单独运行垃圾收集器需要几秒钟的经历,尤其是在使用OpenGL库时 我在Ruby中使用过矩阵数学库,它们的速度特别慢。ruby如何实现基本数学有问题吗 Ruby中是否有任何无法有效实现的动态特性?如果是这样,其他语言如Lua和Python如何解决这些问题 最近有没有显著提高性能的工作?最有问题的部分是“每个人” 如果“每个人”都没有真正使用这种语言,那就有额外的分数了 严重的是,1.9比Python

鲁比在某些事情上反应迟钝。但它的哪些部分是最有问题的

垃圾收集器对性能的影响有多大?我知道我曾经有过单独运行垃圾收集器需要几秒钟的经历,尤其是在使用OpenGL库时

我在Ruby中使用过矩阵数学库,它们的速度特别慢。ruby如何实现基本数学有问题吗

Ruby中是否有任何无法有效实现的动态特性?如果是这样,其他语言如Lua和Python如何解决这些问题


最近有没有显著提高性能的工作?

最有问题的部分是“每个人”

如果“每个人”都没有真正使用这种语言,那就有额外的分数了

严重的是,1.9比Python快得多,现在Jube比Jython快。

到处都是垃圾收集器;例如,java有一个,它比C++在动态内存处理方面更快。Ruby不适合处理数字;但是很少有语言是这样的,所以如果你的程序中有任何语言的计算密集型部分,你最好用C语言重写它们(Java由于其原始类型而在数学方面很快,但它为此付出了高昂的代价,它们在语言中最丑陋的部分显然是1)


至于动态特性:它们并不快,但是在静态语言中没有它们的代码可能会更慢;例如,java将使用XML配置,而不是使用DSL的Ruby;而且,由于XML解析的成本很高,它可能会更慢。

根据一些基准测试,Ruby 1.9.1的速度大约是PHP的两倍,比Perl快一点

(更新:我的来源是()。但我不知道他的来源是什么。)

鲁比并不慢。旧的1.8是,但现在的Ruby不是。

Steve Dekorte:“用高级语言编写Mandelbrot集合计算器就像在公共汽车上运行Indy 500。”

我建议学习各种工具,以便在工作中使用正确的工具。使用高级API可以高效地进行矩阵变换,该API通过算术密集型计算环绕紧循环。参见RubInLein GEM,将C或C++代码嵌入到Ruby脚本中。 还有一种Io语言比Ruby慢得多,但它可以用Pixar高效地渲染电影,并通过使用SIMD加速在向量算法上优于原始C


    • Ruby非常适合快速提供解决方案。在提供快速解决方案方面,情况就不是这样了。这取决于你想解决什么样的问题。我想起了上世纪90年代初在旧CompuServe MSBASIC论坛上的讨论:当被问及Windows开发哪个更快,VB还是C时,通常的答案是“VB,大约6个月”

      在其MRI 1.8版本中,Ruby执行某些类型的计算密集型任务的速度相对较慢。与大多数主流编译语言相比,几乎任何解释语言都会受到这种影响

      原因有几个:有些相当容易寻址(例如1.8中的原始垃圾收集),有些不太容易寻址

      1.9解决了一些问题,尽管它可能需要一段时间才能普遍使用。其他一些以预先存在的运行时为目标的实现,例如JRuby、IronRuby、MagLev,可能会更快


      关于数学性能,我不会惊讶地看到相当慢的吞吐量:这是您为任意精度付出的代价的一部分。再次指出你的问题。我已经用Ruby解决了70多个问题,几乎没有任何解决方案需要运行超过一分钟。您需要它运行多快?需要多长时间?

      我想您会问,“Ruby中的哪些特定技术往往比较慢。”


      一个是对象实例化。如果您正在做大量的工作,那么您需要寻找(合理的)方法来减少这种情况,例如使用,即使内存使用不是问题。在一个库中,我对它进行了一次又一次的修改,使其不再创建许多非常相似的对象,我将库的总体速度提高了一倍。

      Hmm-几年前我在一个项目中工作,我用Ruby性能刮了刮桶,但我不确定此后有什么变化。现在需要注意的是,你必须知道不要做某些事情,坦率地说,游戏/实时应用程序就是其中之一(因为你提到了OpenGL)

      破坏交互性能的罪魁祸首是垃圾收集器——这里的其他人提到Java和其他环境也有垃圾收集,但Ruby必须停止运行。也就是说,它必须停止运行程序,从头开始扫描每个寄存器和内存指针,标记仍在使用的内存,然后释放其余的内存。发生这种情况时,进程不能被中断,正如您可能已经注意到的,这可能需要数百毫秒

      它的执行频率和长度与您创建和销毁的对象数量成正比,但除非您完全禁用它,否则您无法控制。我的经验是,有几种不令人满意的策略可以平滑我的Ruby动画循环:

      • GC.disable/GC.enable绕过关键动画循环,可能是一个机会主义的GC.start,在它不会造成任何伤害时强制它离开。(因为当时我的目标平台是一台64MB的Windows NT计算机,这会导致系统偶尔出现内存不足的情况。但从根本上说,这是一个坏主意——除非在执行此操作之前可以预先计算出可能需要的内存量,否则可能会导致内存耗尽)
      • 减少您创建的对象的数量,使GC有更少的工作要做(减少其执行的频率/长度)
      • 用C重写你的动画循环(一个借口,但是我用的那一个!)
      这些天我