败犬日报 2024-12-08
1. std::function
递归函数开销太大导致 leetcode 题目超时
std::function
的开销主要是两点:1. 有捕获的话,一般会在堆上申请内存;2. 类型擦除带来的虚函数调用。
关于第一点开销,function 和 any 一样可能有小对象优化(libc++ 是 ≤16B)。除此之外编译器很难对此进行优化。
递归最好只用 lambda 完成,具体做法在 败犬日报 2024-10-08 介绍过。
2. asan 开销
https://github.com/google/sanitizers/wiki/AddressSanitizerPerformanceNumbers
平均下来近一倍的开销。
BENCHMARK | O2 | O2+asan | slowdown |
---|---|---|---|
400.perlbench | 344.00 | 1304.00 | 3.79 |
401.bzip2 | 490.00 | 844.00 | 1.72 |
403.gcc | 322.00 | 608.00 | 1.89 |
429.mcf | 316.00 | 583.00 | 1.84 |
445.gobmk | 409.00 | 833.00 | 2.04 |
456.hmmer | 605.00 | 1226.00 | 2.03 |
458.sjeng | 456.00 | 982.00 | 2.15 |
462.libquantum | 480.00 | 539.00 | 1.12 |
464.h264ref | 547.00 | 1311.00 | 2.40 |
471.omnetpp | 314.00 | 587.00 | 1.87 |
473.astar | 403.00 | 655.00 | 1.63 |
483.xalancbmk | 227.00 | 493.00 | 2.17 |
433.milc | 408.00 | 666.00 | 1.63 |
444.namd | 369.00 | 593.00 | 1.61 |
447.dealII | 321.00 | 597.00 | 1.86 |
450.soplex | 233.00 | 367.00 | 1.58 |
453.povray | 189.00 | 425.00 | 2.25 |
470.lbm | 318.00 | 393.00 | 1.24 |
482.sphinx3 | 519.00 | 911.00 | 1.76 |