重新审视克努特(Knuth)的“过早优化”论文

主要观点:

  • 著名的“过早优化是万恶之源”这句引用常被误用,其原文并非关于优化,而是讨论在特定情况下使用goto语句的合理性。
  • 通过knuth_multiset的例子对比了基于数组和基于map的集合存储方式的性能,展示了不同操作的效率差异。
  • 以插入元素的不同方式为例,如insert_1insert_2insert_2a等,说明优化的复杂性和不同情况下的性能表现。
  • 强调要通过基准测试来确定优化是否对程序运行时间有影响,而不是盲目地进行优化。
  • 给出了不同的集合存储和操作方式的比较,包括STLstd::unordered_map和快速哈希表等,说明在不同场景下的选择。

关键信息:

  • “knuth_multiset”使用两个数组存储元素和计数,通过goto语句实现插入操作。
  • 不同插入方式的性能差异,如insert_1为线性搜索,insert_2insert_2a进行了优化。
  • 编译器通常不会自动进行优化,有时需要手动编写汇编代码。
  • 对于小型集合,insert_0可能是最快的;对于大型集合,应使用哈希表。

重要细节:

  • knuth_multiset的插入操作中,insert_1需要额外的检查,insert_2乐观地插入元素以节省条件判断,insert_2a进一步优化了循环。
  • 性能测试表明,不同插入方式在小型集合上速度差异不大,而在大型集合上差异明显,此时哈希表表现更好。
  • STLstd::find在小型和大型集合上的性能表现不同,总体平均是较好的选择。
  • 快速平坦哈希表在较小的插入数量时就表现出色,无需线性搜索。
阅读 12
0 条评论