뻘짓...while (*p++); 이 빠를까요 while (*p) p++; 이 빠를까요?
글쓴이: gurugio / 작성시간: 화, 2012/07/03 - 1:49오후
size_t my_strlen(const char* p) { const char* q = p; while (*q++ != 0) ; return q - p - 1; } size_t my_strlen(const char* p) { const char* q = p; while (*q != 0) q++; return q - p; }
이렇게 2개의 루프가 있습니다.
위에것은 보통 책에 좋다고 써있는 뭔가 있어보이고 또 흔히 사용하는 루프입니다. while 문 안에 ++을 넣지요.
아래것은 루프 코드 안에 ++을 넣습니다. 보통 가독성을 중시하는 분들이 이렇게 쓰신다고 알고있습니다.
심심해서 g++ -S -O2 명령으로 기계어로 변환해보았습니다.
위에 버전입니다.
// .cfi_startproc // movq %rdi, %rax // .L2: // movzbl (%rax), %edx // addq $1, %rax // testb %dl, %dl // jne .L2 // subq %rdi, %rax // subq $1, %rax // ret
아래 버전입니다.
.cfi_startproc cmpb $0, (%rdi) movq $-1, %rax je .L2 movq %rdi, %rax .p2align 4,,10 .p2align 3 .L3: addq $1, %rax cmpb $0, (%rax) jne .L3 subq %rdi, %rax subq $1, %rax .L2: rep ret
메모리를 읽는 횟수는 둘다 1번으로 동일한데
명령어 갯수가 위에 것은 4개 아랫것은 3개입니다.
왜 명령어 갯수가 다를까요?
명령어 갯수가 1개 작으면 더 빠를까요?
오늘의 뻘짓이었습니다.
Forums:
하는 행동이 다르잖아요...
아래쪽 함수의 리턴값이 1 작은데요...
제 실수입니다. 감사합니다.
제 실수입니다.
감사합니다.