将 If 语句上移,将 For 循环下移

主要观点:介绍了关于代码优化的两个经验法则,即“向上推 if 条件,向下推 for 循环”。
关键信息:

  • 对于函数中的 if 条件,可考虑移到调用者处,如将函数中的预条件检查移到调用者,可减少检查次数,避免 if 带来的控制流复杂和错误,且便于发现冗余和死条件。
  • 从数据导向的角度,应将操作对象的“批处理”作为基本情况,将标量版本作为批处理的特殊情况,如 frobnicate_batch 优于逐个处理对象的循环,这样能提高性能,可分摊启动成本,灵活处理对象顺序,甚至可进行向量化操作,如 FFT 基多项式乘法。
  • “向上推 if 条件,向下推 for 循环”这两个建议可相互配合,如在不同条件下对一批对象进行不同操作,避免重复评估条件,移除热循环中的分支,可能实现向量化,这一模式在 TigerBeetle 的架构中也有应用,除了性能提升,有时还能提高表达性,如 jQuery 对元素集合的操作。
    重要细节:
  • 给出了具体代码示例,如函数 frobnicate 中对 Option<Walrus> 的处理,以及不同的 iffor 结构的代码对比等。
  • 提到了相关的“溶解枚举”重构模式,通过将重复的条件提取出来,简化代码结构。
  • 引用了相关资料,如 [http://venge.net/graydon/talk...] 和 [https://en.wikipedia.org/wiki...] 。
阅读 22
0 条评论