软件随想录(local.joelonsoftware.com/wiki)-2006年09月12日 再探Ruby效能 - Ruby Performance Revisited

2006年09月12日 再探Ruby效能 - Ruby Performance Revisited

 

再探Ruby效能

From The Joel on Software Translation Project

这篇文字于2006年9月12日张贴在约耳谈软件首页。

Jack Herrington针对Ruby on Rails的效能议题写电邮给我,信上写著:

我同意你关于Unicode的说法,也同意Rails需要时间发展。不过我用了一堆的Web技术,每个都有问题。 我倒是不同意你对可扩充性(scalability)的说法。我不认为Rails有那种其他技术所没有,而且无法克服的扩充性问题。 我希望你至少能把你对扩充性的说法讲得更清楚。告诉我们是什么样的扩充性问题。即使我们无法替你解决,整个社群还是能由你的经验有所收获。

David Heinemeier Hansson写著:

Rails对绝大多数的web应用而言已经够快了。我们有每天处理数百万个动态网页的网站。如果你的目标是做出像Yahoo或Amazon的首页,大概没有基于任何语言的现成框架能做得好。你很可能得自己来。不过当然啦,我也是喜欢让CPU闲一点。不过恰巧的是,我更希望能让开发者更闲,所以愿意牺牲前者来获得后者。

顺便澄清一下,我在意的是Ruby而不是Rails的效能。原因如下:

我看过许多拿Java(对我而言不算快)之类的bytecode语言和Ruby效能对照的比较,而且我也看到很多效能报告声称Ruby慢十倍慢五十倍云云。除了少数的网志鬼扯外,Ruby在电脑语言对抗评比上几乎是稳吊车尾了。

我并不知道Ruby实现的细节,不过我猜最大的问题大概是在晚期连结(late binding)以及最主要的鸭子类型处理(duck typing)吧,有了后者就不能用类型参考或是强类型处理。这表示函数的呼叫一定会慢,因为你永远没有办法把函数呼叫编译成单一个x86指令集的 CALL指令...你一定得探索对象,甚至可能要扫瞄一个杂凑表才能找到所要呼叫的函数。呼叫对象的方法是个极为常用的操作,在纯面向对象的语言中更是如此。有些语言的对象类型可以在编译时期决定,所以跳跃的指令可以在编译时得到(如C语言),或是透过单一个vtable用一个间接指令取得(如C++中)。Ruby至少得把那一小段程序代码,化简成一个间接CALL的CPU指令,才能提供和这类语言相当的效能。

我了解开发时间比CPU时间更重要的原理,不过坦白说那只不过是保险杆贴纸上的口号,对抱怨效能的人来说并不公平。敝公司的产品FogBugz似乎应该很适合用Ruby on Rails开发,不过其中还是有些地方的效能极为重要。FogBugz 6里就有个地方,得进行数百万次运算才能在单一个网页上显示一个图表。我们在目前的开发环境下做了许多最佳化,才把运算时间缩到三秒左右。坦白地说,如果是用duck-typed函数呼叫的话,我不认为我们能在网页浏览器逾时前或在合理时间内完成。我们也必须用Bayesian过滤器扫瞄进入的电邮讯息。这个计算密集的操作过滤一个讯息约要一秒。对我们很多客户而言,每秒收到一封电子邮件并不算离谱,所以现在的效能非常接近CPU运算能力的极限。而这已经是用一种执行这类程序代码比Ruby快数个量级的语言了。改用Ruby的话我们稳死无疑。

就算是典型单纯的CRUD应用程序,也就是那种只是由数据库读个资料表显示出来,让你增删编辑各笔资料的应用程序,在深入到程序代码某处时,都常会发现某些需要密集运算的动作。比如网志软件可能会要用Bayesian过滤器来消除垃圾意见。你在这种地方就会突然明白,你所选的语言比竞争者慢上十倍,于是你根本就无法加上该功能,不然就得呼叫另一种语言(并且承受附带的转换整编(marshalling)负担)。

并不是每个人都会遇到这种问题,不过当人们说遇到Ruby的效能问题,或仅仅只是想让程序执行得比核心的Ruby语言引擎更快时,Ruby拥护者唱歌颂赞「开发者时间与CPU时间」是没有用的。就算你不做需要密集运算的东西,如果发现自己得买100台服务器而非10台时,你可能就会突然重新思考整个开发者时间与CPU时间的方程序。

我了解有些计画要用某种bytecode编译器来处理Ruby的效能问题,这很不错。当这些计画实现而且Ruby也出现具竞争力的效能评比后,对各式各样的应用可能会更为适合。不过在那之前,我还是会声称并非每种状况都适合使用Ruby。

关于作者: 我是本站站长Joel Spolsky,是一位纽约市的软件开发者。我从2000年起在本站撰写与软件开发、管理、商业以及Internet相关的文章。我平日的工作是经营Fog Creek Software这家公司,产品包括FogBugz这个有个蠢名字但聪明的问题追踪软件,还有透过Internet最简易的远端技术支持方案Fog Creek Copilot,完全不用安装或设定。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值