【发布时间】:2020-09-21 11:03:24
【问题描述】:
我正在尝试使用 libunwind(使用 linux perf)进行配置,perf top 监控目标进程,我得到了这个组装时间成本屏幕:
0.19 │ mov %rcx,0x18(%rsp) ▒
│ trace_lookup(): ▒
1.54 │ mov 0x8(%r9),%rcx ▒
│ _ULx86_64_tdep_trace(): ▒
0.52 │ and $0x1,%edx ◆
0.57 │ mov %r14d,0xc(%rsp) ▒
0.40 │ mov 0x78(%rsp),%r10 ▒
1.24 │ sub %rdx,%r15 ▒
│ trace_lookup(): ▒
0.35 │ shl %cl,%r12d ▒
│ _ULx86_64_tdep_trace(): ▒
2.18 │ mov 0x90(%rsp),%r8 ▒
│ trace_lookup(): ▒
0.46 │ imul %r15,%r13 ▒
│ _ULx86_64_tdep_trace(): ▒
0.59 │ mov %r15,0x88(%rsp) ▒
│ trace_lookup(): ▒
0.50 │ lea -0x1(%r12),%rdx ▒
1.22 │ shr $0x2b,%r13 ▒
0.37 │ and %r13,%rdx ▒
0.57 │177: mov %rdx,%rbp ▒
0.43 │ shl $0x4,%rbp ▒
1.33 │ add %rdi,%rbp ▒
0.49 │ mov 0x0(%rbp),%rsi ▒
24.40 │ cmp %rsi,%r15 ▒
│ ↓ jne 420 ▒
│ _ULx86_64_tdep_trace(): ▒
2.10 │18e: movzbl 0x8(%rbp),%edx ▒
3.68 │ test $0x8,%dl ▒
│ ↓ jne 370 ▒
1.27 │ mov %edx,%eax ▒
0.06 │ shl $0x5,%eax ▒
0.73 │ sar $0x5,%al ▒
1.70 │ cmp $0xfe,%al ▒
│ ↓ je 380 ▒
0.01 │ ↓ jle 2f0 ▒
0.01 │ cmp $0xff,%al ▒
│ ↓ je 3a0 ▒
0.02 │ cmp $0x1,%al ▒
│ ↓ jne 298 ▒
0.01 │ and $0x10,%edx ▒
│ movl $0x1,0x10(%rsp) ▒
│ movl $0x1,0x1c8(%rbx) ▒
0.00 │ ↓ je 393
对应的源码在这里trace_lookup source code,如果我没看错的话,这条热路径cmp指令对应的代码行数是296行,但是不知道为什么这行这么慢而且大部分时间都花费?
【问题讨论】:
-
你能把控制台里的文字复制过来粘贴到这里吗?
-
@phuclv 感谢您的建议,您能回答这个问题吗?
-
因为它是第一条使用前面
mov指令从内存中加载的值的指令。 -
@EOF 那么是缓存未命中造成的吗?我正在考虑是否有可能改进它?我记得我们至少可以减少哈希表存储桶中第一项的缓存未命中。
-
是你使用libunwind的进程吗?你的程序的任务是什么?
perf top命令是什么?有时在默认的perf top输出中很容易将注意力集中在错误的进程上,例如性能本身或错误的函数。
标签: x86-64 profiler perf libunwind