뻘짓...while (*p++); 이 빠를까요 while (*p) p++; 이 빠를까요?

gurugio의 이미지

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개 작으면 더 빠를까요?

오늘의 뻘짓이었습니다.

jick의 이미지

아래쪽 함수의 리턴값이 1 작은데요...

gurugio의 이미지

제 실수입니다.
감사합니다.