最简单的工具来衡量C程序caching命中/未命中和CPU时间在Linux?
我正在用C编写一个小程序,我想测量它的性能。
我想看看它在处理器中运行了多less时间,以及有多lesscaching命中+未命中。 有关上下文切换和内存使用情况的信息也不错。
该程序不到一秒钟执行。
我喜欢/ proc / [pid] / stat的信息,但是在程序死亡/死亡后我不知道如何看到它。
有任何想法吗?
编辑:我认为Valgrind增加了很多开销。 这就是为什么我想要一个简单的工具,像/ proc / [pid] / stat,总是在那里。
使用perf :
perf stat ./yourapp
有关详细信息,请参阅内核wiki perf教程 。 这使用CPU的硬件性能计数器,所以开销非常小。
来自wiki的示例:
perf stat -B dd if=/dev/zero of=/dev/null count=1000000 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000': 5,099 cache-misses # 0.005 M/sec (scaled from 66.58%) 235,384 cache-references # 0.246 M/sec (scaled from 66.56%) 9,281,660 branch-misses # 3.858 % (scaled from 33.50%) 240,609,766 branches # 251.559 M/sec (scaled from 33.66%) 1,403,561,257 instructions # 0.679 IPC (scaled from 50.23%) 2,066,201,729 cycles # 2160.227 M/sec (scaled from 66.67%) 217 page-faults # 0.000 M/sec 3 CPU-migrations # 0.000 M/sec 83 context-switches # 0.000 M/sec 956.474238 task-clock-msecs # 0.999 CPUs 0.957617512 seconds time elapsed
不需要手动加载内核模块,在现代的debian系统上(使用linux-base包),它应该可以工作。 通过“性能logging-a”/“性能报告”组合,您还可以进行全系统性能分析。 具有debugging符号的任何应用程序或库将在报告中显示详细信息。 对于可视化火焰图似乎运作良好。
你也可以使用
/usr/bin/time -v YourProgram.exe
它会告诉你所有这些信息:
/usr/bin/time -v ls Command being timed: "ls" User time (seconds): 0.00 System time (seconds): 0.00 Percent of CPU this job got: 60% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 4080 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 314 Voluntary context switches: 1 Involuntary context switches: 1 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
您还可以使用-f标志来格式化输出以适应您的需求。
请确保使用它的完整path调用该程序,否则它将调用“时间”命令,这不是你所需要的…
希望这可以帮助!
最好的工具叫做valgrind 。 它能够进行内存分析,调用图build立等等。
sudo apt get install valgrind valgrind ./yourapp
但是,要获得程序执行的时间,可以使用time(8)
linux实用程序。
time ./yourapp