linux-直线代码中的指令导致的开销差异很大
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-直线代码中的指令导致的开销差异很大,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1841字,纯文字阅读大概需要3分钟。
内容图文
![linux-直线代码中的指令导致的开销差异很大](/upload/InfoBanner/zyjiaocheng/947/922077000f0743ef98d944157edf7527.jpg)
我试图了解Linux块层的[blk_account_io_completion] [1]中的开销.使用性能注释,我得到以下片段(节略).有人能说明一下添加和测试指令与与其一起执行的相邻指令相比有如此开销的原因吗?
: part_stat_add(cpu, part, sectors[rw], bytes >> 9);
0.13 : ffffffff813336eb: movsxd r8,r8d
0.00 : ffffffff813336ee: lea rdx,[rax*8+0x0]
0.00 : ffffffff813336f6: mov rcx,QWORD PTR [rdi+0x210]
72.04 : ffffffff813336fd: add rcx,QWORD PTR [r8*8-0x7e2df6a0]
0.22 : ffffffff81333705: add QWORD PTR [rcx+rdx*1],rsi
0.61 : ffffffff81333709: mov eax,DWORD PTR [rdi+0x1f4]
26.52 : ffffffff8133370f: test eax,eax
0.00 : ffffffff81333711: je ffffffff81333733 <blk_account_io_completion+0x83>
解决方法:
一个可能的原因是在获取样本时这些指令恰好由指令指针指向.一个典型的x86 CPU每个周期最多可以撤销4条指令,但是当这样做并且样本为令牌时,程序计数器将仅指向一条指令,而不是全部这四个指令.
这是一个示例-参见下文.简单的简单循环,带有一堆nop指令.请注意,时钟间隔如何在间隙中恰好包含三个指令的情况下分布在此配置文件中.这可能类似于您所看到的效果.
或者,可能是mov rcx,QWORD PTR [rdi 0x210]和mov eax,DWORD PTR [rdi 0x1f4]经常错过高速缓存,并将花费在该高速缓存上的周期归于下一条指令,如here.
│ Disassembly of section .text: │ │ 00000000004004ed : │ push %rbp │ mov %rsp,%rbp │ movl $0x0,-0x4(%rbp) │ ↓ jmp 25 14.59 │ d: nop │ nop │ nop 0.03 │ nop 14.58 │ nop │ nop │ nop 0.08 │ nop 13.89 │ nop │ nop 0.01 │ nop 0.08 │ nop 13.99 │ nop │ nop 0.01 │ nop 0.05 │ nop 13.92 │ nop │ nop 0.01 │ nop 0.07 │ nop 14.44 │ addl $0x1,-0x4(%rbp) 0.33 │25: cmpl $0x3fffffff,-0x4(%rbp) 13.90 │ ↑ jbe d │ pop %rbp │ ← retq
内容总结
以上是互联网集市为您收集整理的linux-直线代码中的指令导致的开销差异很大全部内容,希望文章能够帮你解决linux-直线代码中的指令导致的开销差异很大所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。