主要观点:
- Ruby 2.3 及
# frozen_string_literal: true后常处理冻结对象,处理值对象时通常追求不可变性。 - 对于值对象的昂贵计算,可使用 memoization 缓存结果,但冻结对象无法添加新实例变量来缓存。
- 可在计算结果后冻结对象,如在
Distance类中先计算昂贵值再冻结。 freeze不会递归冻结对象,内部缓存有优缺点,如可能导致内存占用。- 外部缓存可减少整个程序中相同昂贵操作的计算时间,但不是线程安全的,需使用
Mutex或相关 gem 解决。 - 不一定总是值得进行 memoization,如对
Distance对象的单位转换,非 memoized 可能更快。
关键信息:
Distance类的初始化及相关方法,如initialize、update、expensive_method等。AngleCache类用于外部缓存。- 通过
Benchmark测量不同方式的性能差异。
重要细节:
- 冻结对象后无法修改自身,但可修改内部包含的可变对象。
- memoization 是存储方法调用结果以避免重复计算。
- 不同情况下使用不同缓存方式的示例及优缺点。
- 性能测量结果显示在某些情况下非 memoized 可能更快。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。