在不可变性和记忆化之间,你可能不得不做出选择

主要观点:

  • Ruby 2.3 及# frozen_string_literal: true后常处理冻结对象,处理值对象时通常追求不可变性。
  • 对于值对象的昂贵计算,可使用 memoization 缓存结果,但冻结对象无法添加新实例变量来缓存。
  • 可在计算结果后冻结对象,如在Distance类中先计算昂贵值再冻结。
  • freeze不会递归冻结对象,内部缓存有优缺点,如可能导致内存占用。
  • 外部缓存可减少整个程序中相同昂贵操作的计算时间,但不是线程安全的,需使用Mutex或相关 gem 解决。
  • 不一定总是值得进行 memoization,如对Distance对象的单位转换,非 memoized 可能更快。

关键信息:

  • Distance类的初始化及相关方法,如initializeupdateexpensive_method等。
  • AngleCache类用于外部缓存。
  • 通过Benchmark测量不同方式的性能差异。

重要细节:

  • 冻结对象后无法修改自身,但可修改内部包含的可变对象。
  • memoization 是存储方法调用结果以避免重复计算。
  • 不同情况下使用不同缓存方式的示例及优缺点。
  • 性能测量结果显示在某些情况下非 memoized 可能更快。
阅读 36
0 条评论