人们为什么说Ruby很慢?[关闭]


184

我喜欢Ruby on Rails,并将其用于我的所有Web开发项目。几年前有很多关于Rails是内存猪的讨论,以及它如何不能很好地扩展,但是这些建议由Gregg Pollack 在这里提出

不过最近,我一直在听到人们说Ruby本身很慢。

  • 为什么Ruby会变慢?

我发现Ruby并不慢,但话又说回来,我只是用它来制作简单的CRUD应用和公司博客。在我发现Ruby变慢之前,我需要做什么样的项目?还是这种缓慢会影响所有编程语言?

  • 如果您想应对这种“缓慢”,作为Ruby程序员,您有哪些选择?

  • 哪个版本的Ruby最适合速度快,流量大的Stack Overflow等应用?

这些问题是主观的,我意识到架构设置(EC2与独立服务器等)有很大的不同,但是我想听听人们对Ruby的看法。

最后,我在Ruby 2.0上找不到太多新闻-我认为距那时还差很多年?




除了很好的答案,他们都没有真正回答为什么。Nakilon
Andre Figueiredo

Answers:


184

为什么Ruby会变慢?

因为如果您在Ruby和其他语言之间运行典型的基准测试,则Ruby会失败。

我发现Ruby并不慢,但话又说回来,我只是用它来制作简单的CRUD应用和公司博客。在我发现Ruby变慢之前,我需要做什么样的项目?还是这种缓慢会影响所有编程语言?

在编写实时数字信号处理应用程序或任何类型的实时控制系统时,Ruby可能无法很好地为您服务。Ruby(使用当今的VM)可能会在资源受限的计算机(例如智能手机)上窒息。

记住,Web应用程序上的许多处理实际上是由用C语言开发的软件完成的。例如Apache,Thin,Nginx,SQLite,MySQL,PostgreSQL,许多解析库,RMagick,TCP / IP等都是Ruby使用的C程序。 。Ruby提供胶水和业务逻辑。

如果您想应对这种“缓慢”,作为Ruby程序员,您有哪些选择?

切换到更快的语言。但这要付出代价。这可能是值得的。但是对于大多数Web应用程序而言,语言选择不是一个相关因素,因为使用足够快速的语言开发的成本更高,因此没有足够的流量来证明其合理性。

哪个版本的Ruby最适合速度快,流量大的Stack Overflow等应用?

其他人已经回答了这个问题-JRuby,IronRuby,REE将使您的应用程序的Ruby部分在可以负担VM的平台上更快地运行。而且,由于通常不是Ruby会导致速度慢,而是计算机系统架构和应用程序架构,因此您可以执行数据库复制,多个应用程序服务器,带有反向代理的负载平衡,HTTP缓存,内存缓存,Ajax,客户端缓存等工作。这些东西都不是Ruby。

最后,我在Ruby 2.0上找不到太多新闻-我认为距那时还差很多年?

大多数人都在等待Ruby 1.9.1。我本人正在等待JRuby上的Ruby 1.9.1上的Rails 3.1。

最后,请记住,许多开发人员选择Ruby是因为与其他语言相比,它使编程更加令人愉悦,并且因为Ruby with Rails使熟练的Web开发人员能够非常快速地开发应用程序。


3
经过深思熟虑,我认为这是最好的答案。谢谢,我喜欢信号处理应用程序的类比。在所有这些有用的答案之后,更容易看到人们在谈论什么。
stephenmurdoch

1
是的,您距离红宝石2,Ruby 2.0.0尚有
Morgan

3
我从使用Ruby 2.1的经验来看,它比在Ruby 2.0中运行的同一个应用程序快25%
Matt Connolly 2014年

14
语言并不慢,它们的实现,解释器和编译器是:)
Zelphir Kaltstahl 2015年

122

首先,关于什么比较慢?C?蟒蛇?让我们在计算机语言基准游戏中获得一些数字

为什么Ruby会变慢?

取决于您问谁。您可能会被告知:

  • Ruby是一种解释语言,解释语言往往会比编译语言慢
  • Ruby使用垃圾回收(尽管C#也使用垃圾回收,在上述算法,内存分配较少的基准测试中,比Ruby,Python,PHP等领先两个数量级)
  • Ruby 方法调用很慢(尽管由于使用鸭子输入,所以可以说它们比强类型解释语言要快)
  • Ruby(JRuby除外)不支持真正的多线程
  • 等等

但是,话又说回来,在什么方面缓慢呢?与C相比,Ruby 1.9的运行速度与Python和PHP差不多(在3倍的性能系数内)(可以快300倍),因此以上内容(除了线程方面的考虑,您的应用程序在很大程度上应依赖此方面) )主要是学术性的。

如果您想应对这种“缓慢”,作为Ruby程序员,您有哪些选择?

编写可扩展性并为其添加更多硬件(例如内存)

哪个版本的Ruby最适合速度快,流量大的Stack Overflow等应用?

好吧,REE(与Passenger结合使用)将是一个很好的候选人。


1
垃圾收集本身不一定很慢,但是MRI的垃圾收集却很慢。如果您需要更快的Ruby,还可以查看JRuby和REE。
安德里亚斯

1
@igouy,是的,2008年中期可能是极端的。我更新了链接,但几个月后它们将过时。:)无论哪种方式,硬件和某些补丁程序级别都可能有所不同,并添加了一些其他测试,但是总体情况没有改变。
vladr

11
>>在相同的数量级之内<<如果您活到7岁或69岁,则在相同的数量级内。这种差异微不足道吗?
igouy

10
@igouy,我不了解您,但是我不是一个可以衡量执行速度的程序。例如,我关心执行速度的地方是HTTP响应呈现时间。我知道我不会注意到7ms和69ms渲染时间之间的差异(尤其是在130ms网络延迟之上)。我确实知道我会注意到7ms和700ms之间的差异,并且我肯定会注意到7ms和7s之间的差异-但不是,不是7ms和69ms之间。
vladr 2014年

3
@ vladr,70ms或700ms怎么样?您能注意到这种差异吗?
Paul Draper

60

这是Rails的创建者David Heinemeier Hansson必须说的:

Rails [Ruby]适用于绝大多数Web应用程序。我们的网站每天要进行数百万次动态页面浏览。如果您最终还是停留在Yahoo或Amazon的首页上,那么任何语言的现成框架都不太可能为您带来很多好处。您可能必须自己动手。但是可以肯定的是,我也想要免费的CPU周期。我只是碰巧更关心免费的开发人员周期,并愿意将前者换成后者。

也就是说,比起雇用更多的开发人员和使用更快但更难维护的语言,花费更多的硬件或机器来解决问题要便宜。毕竟,很少有人用C编写Web应用程序。

Ruby 1.9是对1.8的巨大改进。Ruby 1.8的最大问题在于其解释的特性(无字节码,无编译),并且方法调用(Ruby中最常见的操作之一)特别慢。

几乎所有的东西都不是Ruby中的方法查找并没有帮助-添加两个数字,索引一个数组。在其他语言暴露骇客的地方(Python的__add__方法,Perl的重载.pm),Ruby在所有情况下都执行纯OO,如果编译器/解释器不够聪明,则可能会损害性能。

如果我正在用Ruby编写流行的Web应用程序,那么我的重点将放在缓存上。无论使用哪种语言,缓存页面都会将该页面的处理时间减少为零。对于Web应用程序,数据库开销和其他I / O的影响远远超过语言的速度,因此,我将集中精力进行优化。


7
“毕竟,很少有人用C编写Web应用程序。” -当然不是,但是许多对性能至关重要的网站例如已迁移到Scala。
Dario

6
我不同意“使用更多硬件”价格便宜。很难说服客户他们应该每X个月为托管一次支付更多的钱,因为他们的平台是为开发人员设计的。
凯文(Kevin)2010年

9
@Keven:肯定会降低开发成本吗?否则,首先使用Ruby的意义何在?
rjh

4
@Kevin该声明有点宽泛。如果您需要为流量每增加10%左右(每天约100次访问)设置一个新服务器,则客户显然有权提出投诉。但实际上,在旧硬件无法应对之前,您通常需要先增加流量并将其增加一个数量级。届时,该主题将转移到“要解决的好问题”领域,几乎没有人会抱怨升级硬件。而且,没有“客户”会在没有意识到此类情况的情况下运行如此高流量的网站。
deceze

5
@Kevin-让我们扭转一下。“很难说服客户他们应该等待3个月才能使用新功能,因为他们的平台在设计时就考虑到了计算机。” 如果该新功能将大大增加收入,它将为额外的硬件付费。此外,对于许多应用程序而言,从一开始就选择一种快速的语言是过早的优化。机会是你的瓶颈主要在别处:读取数据库,网络延迟等
内森龙

34

编写代码很慢。读取代码很慢。查找和修复错误很慢。添加功能和增强功能很慢。凡是在先前的基础上有所改进的都是胜利。执行性能很少出现问题。


30
@GregS:如果执行性能会影响可用性,则始终是一个问题。的确,从纯数字的角度来看,在一秒钟或三秒钟内扫描xml文件中的字符串并不重要,但是在谈论面向用户的应用程序时,几秒钟的差异可能会在可用性方面产生很大的差异。
布赖恩·奥克利

5
@Ajax:不,我敢打赌,这是你的制胜法宝。
总统詹姆斯·波克(James K. Polk)

15
到目前为止,我的记录是在一天的工作中每年为公司节省30,000美元。他们的工程师认为,让云计算算法对每次迭代完成的任务数量进行计数更容易理解,从而导致n!查询具有20,000多个工作单元的工作。将其更改为检查是否剩余1个工作项,将其丢弃到n个查询中,并将账单从$ 130 /天减少到$ 20 /天。懒惰的编码员让我赚钱。请鼓励更多懒惰的程序员。
阿贾克斯

10
刚才您发表评论很可笑...我已经转到了另一家公司,由于一家大型美国银行拒绝签署数百万美元的合同,直到该系统,我们才不得不从功能和性能上撤走15名开发人员可以应付他们的负担。他们喜欢我们拥有的功能,而不是他们的执行速度。如果您足够长时间不理会性能,那么拥有什么功能并不重要,因为它们会变得非常慢
Ajax

4
执行性能始终是一个问题,多少才是我们正在谈论的问题。在用户停止购买您的应用(因为它会耗尽电池)之前,您可以在手机上运行多少解释代码?在关闭广告以使您失去广告收入之前,用户需要等待多长时间才能加载页面?回答这些问题,您将对执行性能有多重要。
Sqeaky

15

答案很简单:人们说红宝石很慢,因为根据与其他语言的比较,它慢。但是请记住,“慢”是相对的。红宝石和其他“慢速”语言通常足够快。


是的,这就是我的想法,我的意思是,人们说它很慢,但是对于我的要求来说仍然很快……
stephenmurdoch 2010年

11
>>它仍然满足我的要求,<<它足够快,可以满足所有不需要快的问题:-)
igouy

我对此有些偏见,也许考克斯这是过时的评论。现在我们有了ruby 2.3,从ruby 2.2的经验来看,我发现Rails堆栈很重。如果需要更快的框架,请尝试基于sinatra的pidrano,他们尝试尽可能接近rails命令,但要轻得多。但是他们还没有达到1.0版,还有更多版本要发布,但是根据我的测试,它运行的很好而且很快。我将其与活动记录5和从轨道上借来的pidrano链轮一起使用。使用200个并发连接,我得到1.5秒的响应,而无需数据库查询,链轮的资产
James Tan

5

关于软件的Joel-再探Ruby性能 很好地解释了这一点。可能会过时了...

我建议您像使用Ruby on Rails一样坚持使用它,
如果遇到性能问题,您可能会重新考虑使用其他语言和框架。

在那种情况下,我真的建议C#与ASP.NET MVC 2配合使用,对于CRUD应用程序非常有效。


感谢您的链接,我一直喜欢阅读乔尔的观点。他关于DHH的“保险杠标语”的有趣话...
stephenmurdoch

Quote:“ 这并不适用于所有人,但是当人们说他们在Ruby中遇到性能问题,或者他们只需要能够以比核心Ruby语言引擎运行代码更快的速度运行代码时,它就无济于事了。 Ruby倡导关于开发人员周期与CPU周期的赞美诗
Marc.2377 '19

3

我想说Ruby速度很慢,因为没有花太多精力来加快解释器的速度。同样适用于Python。Smalltalk与Ruby或Python一样动态,但性能却更高,请参见http://benchmarksgame.alioth.debian.org。自从Smalltalk或多或少被Java和C#取代(至少在10年前)之后,就没有再进行任何性能优化工作,而Smalltalk仍然比Ruby和Python快。Xerox Parc和OTI / IBM的员工有钱付给使Smalltalk更快的工作人员。我不明白的是,为什么Google不花钱让Python更快,因为它们是一家大型Python商店。相反,他们将钱花在Go等语言的开发上。


我认为这是因为Python已经有了它,并且在当今已经大量使用。如果需要高性能,可以使用或编织许多库,也可以使用其他东西。
Zelphir Kaltstahl,2015年

据我了解,在Ruby 2.5中已经付出了很多努力。
Marc.2377 '19

2

首先,您是否在乎别人怎么说您喜欢的语言?当它完成必须要做的工作时,您就可以了。

OO不是执行代码的最快方法,但它确实有助于创建代码。智能代码始终比哑代码和无用循环快。我是一名DBA,看到很多这些无用的循环,将它们丢弃,使用更好的代码和查询,并且应用程序更快,更快。您是否关心最后一微秒?您可能已经对语言进行了速度优化,而其他语言则只是完成了他们必须要做的工作,并且可以由许多不同的程序员来维护。

这只是一个选择。


2

显然,谈论Ruby失败的速度。即使基准测试表明Ruby并没有比PHP慢很多。但是作为回报,您将获得易于维护的DRY代码,这是各种语言中所有框架中最好的。

对于一个小型项目,由于代码中没有使用任何复杂的计算,而只是主流的东西,您不会感到任何迟钝(我的意思是直到像<50K用户一样)。

对于更大的项目,为资源付出是有回报的,并且比开发商的工资便宜。另外,事实证明,在RoR上编写代码比任何其他方法都快得多。

在2014年,您谈论的这种速度差异对于大多数网站而言微不足道。


2

处理Ruby在Web应用程序中的性能的方式与使用任何其他编程语言相同:

建筑

与大多数其他Web框架相比,在Rails中更容易做到这一点。

在应用程序级别,通过缓存应该缓存的内容并以智能方式管理对DB的访问(因为对于大多数WEB应用程序,瓶颈通常在“ DB”访问上)。

Rails使解决这些问题变得非常轻松自然。有几种用于缓存数据,页面和片段的抽象,还有一些非常好的抽象以优化和可重用的方式处理SQL部分(Active RecordAREL)。

这就是为什么如此之多的应用程序以更快的但不太具有表现力的语言(例如php)编写的结果却比Ruby同行慢的原因。使用这些语言来处理缓存和查询要比使用Ruby来的容易和优雅。

在基础架构级别,可以考虑负载平衡以及我不太了解的所有内容。我会通过雇用某些平台作为服务提供商来外包该问题,例如HerokuEngine Yard。无论如何。部署带有负载平衡的Rails可能不是很难。


1

在许多易于测量的任务(例如,代码严重依赖浮点)上,Ruby比C ++慢。这不是很令人惊讶,但是对于某些人来说,无条件地说“ Ruby is Slow”足够合理。他们没有想到这样的事实:编写Ruby代码比使用C ++更加容易和安全。

最好的解决方法是在您的Ruby代码中使用以另一种语言(例如C,C ++,Fortran)编写的目标模块。这些可以完成繁重的工作,您的脚本可以专注于更高级别的协调问题。


通常使用Java,C#,Python(也许是Perl而不是C ++)进行比较。
rjh 2010年

5
当然。但是我可以向您(作为Tcl的开发人员)保证,人们总是会不公平地将您与其他语言进行比较。解决方法是将这些其他语言用于缝合在一起的组件。用一种语言完成所有操作有点像使用单个工具来完成所有任务。如果您只有锤子,一切看起来都像拇指。
多纳研究员2010年

在需要时使用外语模块的好主意
stephenmurdoch 2010年

>>表示没有资格的“ Ruby很慢” <<几年前,他们可能继续展示比Tcl程序慢的Ruby程序:-)
igouy 2010年

1
您知道他们对谎言,该死的谎言和基准的评价。;-)
Donal Fellows

0

性能几乎总是与良好的设计和优化的数据库交互有关。Ruby可以满足大多数网站的需求,尤其是最新版本。开发速度和易于维护性可为您带来巨大的成本回报,并使客户满意。我发现JAVA对于某些任务的执行性能较慢,并且鉴于使用JAVA进行开发的困难,许多开发人员都创建了较慢的应用程序,而不管基准测试中演示的理论速度能力如何(基准通常是为了表现出特定而狭窄的功能)。当我需要非常不适合数据库功能的密集处理时,可以根据平台选择C或Objective-C或其他真正高性能的编译语言来完成这些任务。如果我需要创建一个数据库化的Web应用程序,根据其他要求,我使用RoR或有时使用C#ASP.NET。因为所有平台都有优点和缺点。应用程序执行操作的执行速度很重要,但毕竟,只有一种语言的狭窄方面的执行性能才是最重要的。那么我可能仍然对所有内容都使用汇编语言。



-5

Ruby对于开发人员的生产力表现良好。由于缺乏类型,Ruby本质上会强制进行测试驱动的开发。Ruby用作C库的高级包装时,性能很好。当Ruby通过JVM或Rbx VM JIT编译为机器代码时,它在长时间运行的过程中也表现良好。当需要使用纯红宝石代码在短时间内对数字进行运算时,Ruby的性能不佳。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.