루틴이 0 값으로 작동 할 수있는 조건부 점프를 포함하지 않는 것이 가장 좋습니다. BSWAP는 2 배 이상 8 시프트해야합니다. IMUL을 LEA/ADD 콤보로 변경할 수 있습니다.
mov eax,[esi]
mov edx,eax
and edx,0x0000000F
mov ecx,eax
shr ecx,8
and ecx,0x0000000F
;;;imul ecx,10
lea ecx,[ecx+ecx*4]
add ecx,ecx
add edx,ecx
bswap eax
and eax,0x0000000F
;;;imul eax,100
lea eax,[eax+eax*4]
add eax,eax
lea eax,[eax+eax*4]
add eax,eax
add edx,eax
skip:
편집
원래 질문은 입력 범위는 [0.00,1.00]이 될 것이라고 언급하지 않았다. 실제로 주어진 예제 (1.23)는이 범위를 벗어나므로 전체 범위가 암시되었음을 이해했습니다. 이것이 제가 조건부 점프를 더 이상 포함하지 않는 주된 이유입니다.
실제 주소 모드의 펜티엄 133에서 모든 사람의 코드를 테스트 한 결과 이러한 실행 시간이 나타났습니다.
sudhanshu bahuguna Rudy Velthuis user3144770
[0.00,9.99] 19.640 sec 18.921 sec 19.161 sec
[0.00,1.00] 13.244 sec 11.460 sec 19.161 sec
는 몇 가지 테스트 후 나는 잘 알려진 LEA와
imul ecx,10
교체/콤보를 ADD하는 것은 매우 수익성있는 것을 발견했다. 반면에
imul eax,100
을 교체하면 상황이 악화되었습니다 (대략 같은 금액만큼). 제한된 입력 범위가 주어진다면
jz skip
마지막이 중요하다는 것을 깨달았습니다. 그래서 나는이 모든 결과를 두 가지 대답에 모두 소개하고 이러한 실행 시간을 얻었습니다.
sudhanshu bahuguna Rudy Velthuis (2) user3144770 (2)
[0.00,9.99] 19.640 sec 17.843 sec 17.364 sec
[0.00,1.00] 13.244 sec 11.448 sec 12.035 sec
이러한 결과에 여전히 압도 당하지는 않았지만, 나는 항상 9.580 초안에 실행되는 훨씬 빠른 해결책을 고안했습니다.
SSE2가 옵션이면 모든 숫자를 병렬로 곱셈 해 볼 수 있고 두 개의 수평 덧셈을 사용하여 모든 것을 합산 할 수 있다고 가정하십시오. 그게 더 효율적인지는 모르겠지만. 당신은 그것을 시도하고 약간의 측정을 할 수 있습니다. – Michael
'실행 시간, 코드 크기, 우아함 측면에서 '더 효율적입니까? (단 하나의 선택 만 가능) –
보다 효율적인 = 최소 실행 시간. –