아무도 당신에게 아무 숫자도주지 않았기 때문에, 나는 매우 memcpy-heavy 인 가비지 컬렉터를 벤치마킹하여 찾은 것을 몇 가지 알려줄 것입니다. 복사 할 객체는 길이가 60 % 16 바이트이고 나머지 30 %는 500 - 8000 바이트 정도입니다.
- 전제 조건 : 두
dst
, src
및 n
는 8
- 프로세서의 배수는 다음과 같습니다 AMD 페넘 (TM) II X6의 1090T 프로세서 64 비트/리눅스
여기
내 세 memcpy
변종은 다음과 같습니다
손으로 코딩 된 while 루프 :
if (n == 16) {
*dst++ = *src++;
*dst++ = *src++;
} else {
size_t n_ptrs = n/sizeof(ptr);
ptr *end = dst + n_ptrs;
while (dst < end) {
*dst++ = *src++;
}
}
(ptr
은 uintptr_t
의 별명입니다.) 시간 : 101.16 %
rep movsb
if (n == 16) {
*dst++ = *src++;
*dst++ = *src++;
} else {
asm volatile("cld\n\t"
"rep ; movsb"
: "=D" (dst), "=S" (src)
: "c" (n), "D" (dst), "S" (src)
: "memory");
}
시간 : 103.22 %
rep movsq
if (n == 16) {
*dst++ = *src++;
*dst++ = *src++;
} else {
size_t n_ptrs = n/sizeof(ptr);
asm volatile("cld\n\t"
"rep ; movsq"
: "=D" (dst), "=S" (src)
: "c" (n_ptrs), "D" (dst), "S" (src)
: "memory");
}
시간 : 100.00 %의 작은 차이로
req movsq
승리.
나는 이것을 5 년 동안 들여다 보지 않았다. 그러나 그때 나의 개인적인 경험은 적어도 회상 변이가없는 반면 movsd와 rep stosd는 단순한 루프보다 빠르다는 것이었다. 그것은 이후 크게 바뀔 수있었습니다. –
다른 프로세서에서 테스트를 수행하고 직접 확인하십시오. –
입력 해 주셔서 감사합니다. Alex : 아마 결국은되지만, 다른 procs를 많이 사용하지는 않으므로 파이프 라인이없는 에뮬레이터와 비교할 때 실제 proc에있을 것입니다. 또한, 게으르다. 누군가 다른 사람이 이미 그 일을했다면 오히려 그 일을하지 않을 것이다. :) – RyanS