看了MIT OpenCourseware中关于6.172:“软件系统的性能工程”的前五讲后,我在一个中等大的测试文件上运行了Linux性能分析器“ perf”。结果似乎显示流水线停滞,其中一条指令必须等待上一条指令的结果。
│ while (lookahead != 0) {
│ /* Insert the string window[strstart .. strstart+2] in the
│ * dictionary, and set hash_head to the head of the hash chain:
│ */
│ INSERT_STRING(strstart, hash_head);
2.07 │ movzbl 0x8096d82(%edx),%eax
3.99 │ mov %edx,%ebp
│ shl $0x5,%ecx
0.03 │ and $0x7fff,%ebp
1.94 │ xor %ecx,%eax
1.43 │ and $0x7fff,%eax
2.01 │ mov %eax,0x805e588
2.40 │ add $0x8000,%eax
0.88 │ movzwl 0x8062140(%eax,%eax,1),%ecx
23.79 │ movzwl %cx,%edi
│ /* Find the longest match, discarding those <= prev_length.
最后一条指令要复制到第二条指令%ecx
,最后一条指令必须等待(暂存管道),直到%cx
寄存器中的数据准备就绪为止。该管道停顿阻止了包含循环。
这是某些真正晦涩的“老式” C编程风格的结果。
dd
一样吗?