我一直在对各种 Ruby 框架进行一些性能测试,结果发现 Espresso 比现有的任何框架都快得多。我有一个用 Sinatra 编写的大型代码库,并且很想加快应用程序的速度,并且想知道是否有可能以某种方式提取 Espresso 的底层引擎并将其插入 Sinatra。有没有人考虑过这个?我知道它们都基于 Rack,那么真正解释性能差异的原因是什么?
2 回答
快速浏览一下 Espresso,我会说它更快,因为它的简单性而不是任何可重复使用的更深层次的“引擎”。
在 Sinatra 或 Rails 下运行的 Web 服务在处理和准备请求数据时使用了更多的抽象,导致更多的方法调用,与 Espresso 更简单的框架相比,这增加了开销。
从 Sinatra 到 Espresso 的转换将是使用 Espresso 的 DSL 的转换,它比 Sinatra 的基于块的路由更直接地公开方法。您不能轻松地将 Sinatra 路线连接到 Espresso,如果您设法这样做,也不太可能导致速度提高。那是因为您最终仍会使用 Sintatra 的路线处理,这是造成速度差异的主要原因。
在实践中,只有当您尝试创建响应时间低于 10 毫秒的高性能服务时,两者之间的速度差异才是问题。这需要系统的其他部分也进行高度优化,而不仅仅是请求处理框架,在实践中,在大多数应用程序中,它只消耗服务器总响应时间的一小部分。
尼尔的回答足够全面。
我只能补充一点,按照设计,Espresso 会在加载时完成大部分路由工作。
在运行时,它将请求直接传递给匹配的操作,这是一个 Ruby 方法。
此外,Espresso 正在使用自己的 URL 映射器,该映射器根据特定需求进行了优化。
不确定在 Sinatra 中使用 Espresso 的引擎。
可能更容易找到将 Sinatra 的 DSL 转换为 Ruby 方法的“简单”方法......