是什么让Ruby慢?

Ruby在某些事情上很慢。 但是哪些部分是最成问题的呢?

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

我用Ruby的matrixmath库特别慢。 ruby如何实现基本的math运算有问题吗?

Ruby中是否有任何dynamic特性不能有效地实现? 如果是这样,Lua和Python等其他语言如何解决这些问题?

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

Ruby很慢。 但是哪些部分是最成问题的呢?

它为方法“后期查找”,以便灵活性。 这会让它变慢。 它还必须记住每个上下文的variables名称以允许eval,所以其框架和方法调用较慢。 另外它目前还没有一个好的JIT编译器,尽pipeMRI 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并重新编译来减less命中。

我用Ruby的matrixmath库特别慢。 ruby如何实现基本的math运算有问题吗?

Ruby 1.8“没有”实现基本的math实现Numeric类,你会打电话像Fixnum#+ Fixnum#/每次调用一次 – 这是缓慢的。 Ruby 1.9通过内联一些基本的math运算来作弊。

Ruby中是否有任何dynamic特性不能有效地实现? 如果是这样,Lua和Python等其他语言如何解决这些问题?

像eval这样的东西很难有效地实现,尽pipe可以做很多工作,我敢肯定。 对于Ruby来说,踢球者必须要适应另一个线程中的某个人自发地改变一个类的定义,所以它必须非常保守。

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

1.9就像是一个2x加速。 这也是更节省空间。 JRuby不断尝试提高速度[而且可能在GC中花费的时间less于KRI]。 除此之外,我不知道除了我一直在做的小事情之外。 还要注意,由于编码的友好性,1.9的string有时会变慢。

Ruby非常适合快速交付解决scheme。 更不用说提供快速解决scheme。 这取决于你想要解决什么样的问题。 我想起了90年代初在CompuServe MSBASIC论坛上的讨论:当被问及Windows开发速度是VB还是C时,通常的答案是“VB约6个月”。

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

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

1.9解决了一些问题,尽pipe在普遍可用之前可能还需要一些时间。 以预先存在的运行时为目标的其他一些实现,比如JRuby,IronRuby,MagLev等,都有可能更快。

关于mathperformance,如果吞吐量相当缓慢,我不会感到惊讶:这是您为任意精度而支付的价格的一部分。 再次,挑选你的问题。 我在Ruby中解决了70多个Project Euler问题,几乎没有任何解决scheme需要运行一个多小时。 你需要多快的速度运行,你需要多快?

最有问题的部分是“大家”。

如果“每个人”都没有真正使用这种语言,那么奖励点就是这样。

严重的是,1.9是更快,现在是python齐比,jruby比jython更快。

垃圾收集者到处都是; 比如Java有一个,在dynamic内存处理上比C ++要快。 Ruby不适合数字处理; 但几乎没有语言,所以如果你的程序中有任何语言的计算密集型的部分,你最好用C语言来重写它们(由于Java的原始types,Java是math的快速algorithm,但是它为它们付出了沉重的代价, 1在语言的最低部分)。

至于dynamic特性:它们不是很快,但是在静态语言中没有它们的代码可能会更慢; 例如,java会使用XMLconfiguration,而不是使用DSL的Ruby; 而且由于XMLparsing代价高昂,所以可能会很慢。

嗯 – 几年前我曾经在一个项目上做过一个项目,在这个项目中,我用Ruby的性能来挖掘桶,而且我也不确定自那以后有什么改变。 现在要注意的是 – 你必须知道不要做某些事情,坦率地说,游戏/实时应用程序就是其中之一(因为你提到了OpenGL)。

杀死交互式性能的罪魁祸首是垃圾收集器 – 这里的其他人提到Java和其他环境也有垃圾收集器,但是Ruby的不得不停止世界运行。 也就是说,它必须停止运行程序,从头开始扫描每个寄存器和内存指针,标记仍在使用的内存,然后释放剩余的内存。 这一过程不能被中断,正如你可能已经注意到的那样,这可能需要几百毫秒。

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

  • GC.disable / GC.enable关键animation循环周围,也许机会GC.start迫使它去,当它不能造成任何伤害。 (因为我当时的目标平台是一台64MB的Windows NT机器,偶尔会导致系统内存不足,但从根本上来说,这是一个坏主意 – 除非在执行此操作之前可以预先计算出您可能需要的内存大小,冒着内存耗尽的风险)
  • 减less您创build的对象的数量,使GC减less工作量(降低执行的频率/长度)
  • 用C重写你的animation循环(一个cop-out,但是和我一起去的!)

现在我可能也会看到JRuby是否会作为另一个运行时工作,因为我相信它依赖于Java更复杂的垃圾收集器。

我发现的另一个主要的性能问题是在Ruby中尝试编写TFTP服务器时的基本I / O问题(是的,我select了所有最适合我的性能关键项目的语言,这只是一个实验)。 最简单的最简单的循环就是简单地响应一个UDP数据包与另一个UDP数据包,这个数据包含下一个文件,一定比C版慢了20倍。 我怀疑可能有一些改进,使基于使用低级别的IO(sysread等),但慢的可能只是在事实上没有低级别的字节数据types – 每一个小的阅读被复制到一个串。 这只是猜测,虽然我没有进一步做这个项目,但它警告我依靠活泼的I / O。

尽pipe我并没有完全掌握最新的速度,但最近主要的速度提高了,那就是虚拟机的实现重做了1.9,从而加快了代码的执行速度。 但是我不认为GC已经改变了 ,而且我很确定I / O前端没有什么新东西。 但是我还没有完全掌握Ruby的最新进展,所以别人可能会想要在这里开发。

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

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

我build议学习各种工具,以便使用正确的工具进行工作。 使用高级API可以有效地完成matrix转换,这些API使用计算密集型计算来实现紧密循环。 有关将C或C ++代码embeddedRuby脚本的示例,请参阅RubyInline gem。

还有Io语言,它比Ruby慢得多,但它通过使用SIMD加速,在Pixar中高效渲染电影,并且在向量运算上优于原始C语言。

我假设你问,“Ruby中的特定技术往往是缓慢的。”

一个是对象实例化。 如果你正在做大量的工作,你想看看(合理的)减less方法,比如使用flyweight模式 ,即使内存使用不是问题。 在我修改过的一个图书馆里,一次又一次地创造了很多非常相似的东西,我把图书馆的整体速度提高了一倍。

根据一些基准testing,Ruby 1.9.1的速度是PHP的两倍,比Perl快一点。

(更新:我的源代码是这个 ( 截图 ),但我不知道他的来源是什么。)

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

Ruby是缓慢的,因为它被devise为优化程序员的经验,而不是程序的执行时间。 缓慢只是devise决定的一个症状。 如果你喜欢表演乐趣,你可能应该使用不同的语言。 Ruby不适合所有的事情。

海事组织,dynamic语言一般都很慢。 他们在运行时做一些静态语言在编译时所做的事情。

语法检查,解释和types检查,转换。 这是不可避免的,所以ruby比c / c ++ / java慢,如果我错了,请纠正。