6.172のMIT OpenCoursewareの最初の5つほどの講義「ソフトウェアシステムのパフォーマンスエンジニアリング」を見た後、Linuxパフォーマンスアナライザー「perf」を適度に大きなテストファイルで実行しました。結果は、1つの命令が前の命令の結果を待たなければならないパイプラインストールを示しているように見えます。
│ 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.
最後から2番目の命令はへのコピーで%ecx
あり、最後の命令は、%cx
データが使用できるようになるまでレジスタが待機する(パイプラインを停止する)必要があります。このパイプラインストールは、包含ループを保持します。
これは、いくつかの本当にあいまいな「古い」Cプログラミングスタイルの結果です。
dd
同じことができますか?