稍微扩展一下 Ryan Doherty 的回答...
我在日常工作中使用静态类型语言 (.NET/C#),并将 Ruby 作为副业。在我现在的日常工作之前,我是一家 ruby 开发公司的首席程序员,为 New York Times Syndication 服务工作。在此之前,我也在 PHP 中工作过(虽然很久很久以前)。
我这么说只是为了这么说:我亲身经历过 Rails(以及更普遍的 ruby)性能问题,以及其他一些替代方案。正如 Ryan 所说,你不会让它自动为你扩展。找到你的瓶颈需要工作和极大的耐心。
我们从其他人甚至我们自己那里看到的大部分性能问题都是处理我们的 ORM 层中执行缓慢的查询。我们从 Rails/ActiveRecord 到 Rails/DataMapper,最后到 Merb/DM,每次迭代都因为底层框架而变得更快。
缓存为性能带来了惊人的奇迹。不幸的是,我们无法缓存我们的数据。我们的缓存最多每五分钟就会有效地失效。我们网站的几乎每一点都是动态的。因此,如果/当您无法做到这一点时,也许您可以从我们的经验中学习。
我们最终不得不认真地微调我们的数据库索引,确保我们的查询没有做非常愚蠢的事情,确保我们执行的查询没有超出绝对必要的数量,等等。当我说“非常愚蠢的事情",我的意思是1+N查询问题……
#1 query
Dog.find(:all).each do |dog|
#N queries
dog.owner.siblings.each do |sibling|
#N queries per above N query!!
sibling.pets.each do |pet|
#Do something here
end
end
end
DataMapper 是处理上述问题的好方法(没有 1 + N 的问题),但更好的方法是动用你的大脑,停止做这样的查询:D当您需要原始性能时,大多数 ORM 层将无法轻松处理极其自定义的查询,因此您不妨手写它们。
我们也做了一些常识性的事情。我们为我们不断增长的数据库购买了一个强大的服务器,并将它移到它自己的专用盒子上。我们还必须不断进行大量的处理和数据导入。我们也将处理转移到它的自己的盒子上。我们还停止为我们的数据导入实用程序加载整个该死的堆栈。我们只加载了我们绝对需要的内容(从而减少了内存开销!)。
如果您还不能确定...一般来说,当涉及到 ruby/rails/merb 时,您必须扩展,从而将硬件问题抛诸脑后。但归根结底,硬件很便宜;虽然这不是伪劣代码的借口! :D
即使有这些困难,如果我能提供帮助,我个人绝不会在另一个框架中启动项目。我爱上了这种语言,并且每天都在不断地了解它。这是我从 C# 中得不到的东西,尽管 C# 更快。
我也喜欢开源工具,开始使用该语言的低成本,将一些东西拿出来并尝试看看它是否有市场的低成本,同时使用一种经常可以使用的语言工作优雅美丽……
最后,在选择框架时,一切都取决于您日复一日的生活、呼吸、饮食和睡眠。如果您喜欢 Microsoft 的思维方式,请选择 .NET。如果您想要开源但仍然想要结构,请尝试 Java。如果您想拥有一种动态语言并且仍然比 ruby 具有更多的结构,请尝试使用 python。如果你想要优雅,试试 Ruby(我开玩笑,我开玩笑......还有许多其他优雅的语言符合要求。不要试图引发一场激烈的战争:D)
见鬼,都试试吧!我倾向于同意上面的答案,即早期担心优化并不是你应该或不应该选择框架的原因,但我不同意这是他们唯一的答案。
所以简而言之,是的,你必须克服一些困难,但是语言的优雅,恕我直言,远远超过了这些缺点。
对于这部小说,我感到很抱歉,但我来回遇到了性能问题。 可以克服。所以不要让这把你吓跑。