Measure the time to reach the main function using perf?
我想通过测量到达主函数的时间来测量我的程序初始化时间,这样我就得到了”运行时初始化”的时间(例如,bss 部分设置为 0 并调用了全局构造函数) .
我如何使用
将一些可以立即终止进程而很少或根本没有清理的东西,例如 exit_group,作为 main 中的第一件事,然后使用
如果您不需要专门使用
我经常使用
首先,您必须考虑到
如果时间到达
1)
上的动态跟踪点
1
|
$ sudo perf probe -x ./gctor main Added new event: probe_gctor:main (on main in ./gctor)
|
您现在可以在所有性能工具中使用它,例如:
1
|
perf record -e probe_gctor:main -aR sleep
|
这确实需要相当高的权限,我将在示例中使用 root。
2) 二进制文件的”开始”是一个明智的点。
我建议使用跟踪点
把它放在一起:
1
2 |
sudo perf record -e probe_gctor:main -e syscalls:sys_exit_execve ./gctor
^ this is what perf probe told you earlier |
然后用
查看
1
2 3 4 5 6 7 8 |
# time of first sample : 77582.919313
# time of last sample : 77585.150377 # sample duration : 2231.064 ms [….] # ======== # gctor 238828 [007] 77582.919313: syscalls:sys_exit_execve: 0x0 gctor 238828 [001] 77585.150377: probe_gctor:main: (5600ea33414d) |
您可以从这两个样本中计算它,或者如果您的跟踪中确实只有两个样本,则使用
为了完整性:这是一种使用
的方法
1
|
gdb ./gctor -ex ‘b main’ -ex ‘python import time’ -ex ‘python ts=time.time()’ -ex ‘run’ -ex ‘python print(time.time()-ts)’
|
这不太准确,在我的系统上大约有 100 毫秒的开销,但它不需要更高的权限。您当然可以通过在 C 中使用
另一种选择是提供您自己的可执行入口点,该入口点记录时间戳计数器,然后将控制权转移到标准入口点
工作示例:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
[max@supernova:~/src/test] $ cat test.cc #include <stdint.h> #include <stdio.h> extern uint64_t start_tsc; int main() { [max@supernova:~/src/test] $ cat mystart.asm section .text section .data [max@supernova:~/src/test] $ make [max@supernova:~/src/test] $ ./test |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269880.html