Skip to content

败犬日报 2024-11-29

1. Linux 看程序执行了哪些系统调用

strace 一下。

2. std::string::clear 复杂度

https://zh.cppreference.com/w/cpp/string/basic_string/clear:

复杂度

与字符串的大小成线性,尽管既存实现在常数时间内操作。

没有要求是常数时间。

std::vector::clear 也同理。

3. 性能是怎么分析的

性能分析很复杂,这里也只讲了很有限的方法论。

一种是使用时间函数的性能测试。比如 benchmark,进一步可以在程序中间获取时间,从而得到详细的 profile 图。下图是 PyTorch 的 profile 图:

img

类似原理还有火焰图,以一个固定频率获取程序函数栈,就能知道什么函数耗时较长。

火焰图可以分 off cpu 和 on cpu。火焰图宽的地方很难知道具体原因,这个时候就需要 strace/eBPF 看具体的 syscall 怎么回事。

img

一种是 PMU 事件,通过硬件提供的 PMU 收集一些事件的计数,比如 cycle 数、指令数、cache miss、TLB Miss、分支预测失败、访存量、浮点运算次数等。进一步可以 topdown 分析。

sh
>>> perf stat ./main
 Performance counter stats for './main':

         55,374.68 msec task-clock:u                     #   14.748 CPUs utilized             
                 0      context-switches:u               #    0.000 /sec                      
                 0      cpu-migrations:u                 #    0.000 /sec                      
               175      page-faults:u                    #    3.160 /sec                      
   210,174,397,681      cycles:u                         #    3.795 GHz                       
    59,993,767,241      instructions:u                   #    0.29  insn per cycle            
     7,776,746,070      branches:u                       #  140.439 M/sec                     
         1,687,629      branch-misses:u                  #    0.02% of all branches           

       3.754660324 seconds time elapsed

      55.360247000 seconds user
       0.009982000 seconds sys

应用层面是 red 原则 (request rate, error rate, duration) 和 use 原则 (usage, saturation, error)。

常见的工具包括 perf、gprof、valgrind、vtune(intel)、nsys/ncu(nvidia)、instruments(apple)。