我尝试通过将重复代码提取到模块中来清理 Rails 应用程序的模型。我知道这会让我的代码更加干燥,但是它会让我的应用程序性能更高吗?我想问题是:模块中的代码是一次性加载到内存中还是每次包含在类中时都会加载?因此,是否建议将模块包含到 ActiveRecord::Base 中,还是只应将它们包含在需要它们的类中?
最佳答案
如require
被记录为当被告知加载已加载的文件时给出不同的返回状态,我假设代码仅被解析一次。
关于性能提升:对于 Java 间接寻址,会增加方法执行的惩罚,如果方法本身很小并且仅在某些级别的继承之外发现,那么这种惩罚可能会变得很重要。 另一方面,JVM 会尝试将 Java 字节码转换为 Native 字节码,从最常调用的方法开始。对于 JRuby 来说,这显然意味着只定义一次的方法比其他方法更有可能(尽早)优化。
我不知道 Ruby 解释器的确切行为,但假设它也会首先优化更频繁调用的方法。
与任何性能问题一样,我也会假设,不存在“这总是表现更好”的情况,需要单独的基准测试来找到适合每种情况的最佳方法。
我建议
- 进行 DRY 编程,以便您可以轻松调整代码以满足新要求
- 查看生成的程序的性能
- 如果您对性能不满意(且仅在此时)
- 识别经常调用的函数和长时间运行的函数
- 尝试将这些函数直接移至类中或以通常调用较少函数的方式重写
将模块包含到不使用它们的类中可能会变得令人恼火,并且只能在启动应用程序后直接提高性能,因为它们可能会被提前解析。我建议不要这样做。
关于ruby-on-rails - 将类函数分解为模块是否可以提高 Rails 的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737090/