이것은 문자열의 길이에 따라 다르므로 가장 쉬운 경우, 최악의 경우 및 중간의 3 가지 경우를 생각해 보겠습니다. 모두 32 비트 부호없는 정수입니다. 값은 0, 4294967295 및 67295 (절반 길이 문자열)입니다.문자열을 정수로 변환하는 데 CPU주기가 얼마나 걸립니까?
i7 Nehalem과 같이 최신 CPU에서 작동한다고 가정 해 보겠습니다.
이 작업이 구체적인 숫자와 함께 CPU 집약적 인 방법을 보여 드리고 싶습니다. 알고리즘은 일반적으로 하나의 반복이 이전 반복의 결과를 필요로하는 작은 루프이므로 코드는 상위 수퍼 CPU 최적화를 이용하지 않습니다.
최신 CPU에서이 작업을 수행하기 위해 유선 명령이 있습니까?
편집 : 나 자신에게 대답하려고 시도하고 검색을 수행했습니다. this answer
;parameters esi is a pointer to the string, ecx the length of the string
string_to_int: ;
xor ebx,ebx ; clear ebx > 1,1
.next_digit:
movzx eax,byte[esi] ; > 1,1
inc esi ; > 1,1
sub al,'0' ; convert from ASCII to number > 1,1
imul ebx,10 ; > 1,3
add ebx,eax ; ebx = ebx*10 + eax > 1,1
loop .next_digit ; while (--ecx) > 6
mov eax,ebx ; > 1,1
ret
처음이자 마지막 명령에서 Agner Fog's 'Instruction Tables' 및 코드를 사용하여
한 번 실행됩니다. 다른 대기 시간과 실행의 합은 반복 당 18입니다. 따라서 질문의 대답은 4 + 18 * string.length 여야합니다.
- "0"= 22 사이클
- "4294967295"= 184 사이클
- "67,295"= 94 사이클
생각보다 훨씬 작다. 이것은 변환 전용이며 NIC 버퍼에서 RAM으로, RAM에서 CPU 캐시로 복사 ...
올바른 일을 계산합니까? 이 말이 맞는지 저에게 말할 수있는 미세 최적화 전문가가 있습니까? (Mystical maybe?;))
http://stackoverflow.com/questions/20819206/8086-assembly-convert-input-string-to-integer – Cratylus
@Cratylus : 문자열을 int로 변환하는 방법에 대해 많은 질문이 있지만 그렇지 않습니다. CPU주기를 계산하십시오 (서브, 멀, 추가를위한 얼마나 많은 사이클을 ...) – bokan
컴퓨터는 바이트를 사용하고, 문자열은 인간을위한 것입니다. 변환에 소요되는 시간은 부적절합니다. 필요한 I/O보다 항상 빠릅니다. –