6.172에 대한 MIT OpenCourseware에서 "소프트웨어 시스템의 성능 엔지니어링"의 첫 5 개 강의를 살펴본 후, 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
똑같이 할 수 있습니까 ?