linux memcpy 독특하게 구현돼있네요.. 이유가 뭘까요?
글쓴이: won1596 / 작성시간: 금, 2014/12/26 - 4:03오후
아래와 같이 되어있습니다. 보니까 8의 배수로 복사를 하고 남은걸 4, 2, 1개단위로 복사하는 모양이네요
그러니까 사이즈가 37이면 8 8 8 8 4 1 이렇게 복사하는것 같습니다.
이유가 뭘까요? 8인걸로봐서 캐시나 1byte와 관련이 있을것 같은데..
char* memcpy(char* dest, char* src, int size) { int i = 0; unsigned char *d = (unsigned char *)dest, *s = (unsigned char *)src; for (i = size >> 3; i > 0; i--) { *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; } if (size & 1 << 2) { *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; } if (size & 1 << 1) { *d++ = *s++; *d++ = *s++; } if (size & 1) *d++ = *s++; return dest; }
실제로 실행결과도 단순히 for문으로 복사한것보다 20%정도는 빠르네요.
File attachments:
첨부 | 파일 크기 |
---|---|
23.png | 10.54 KB |
Forums:
대표적인 loop 최적화 방식입니다.저렇게
대표적인 loop 최적화 방식입니다.
저렇게 처리해주면 i > 0의 조건문이 8배 적게 동작하기때문에 수행시간이 빨라지게됩니다.
한번에 8바이트씩도는데 8의 의미는모르겠으나
뒤따라오는 4 2 1또한 조건을 적게 사용하기위한
최적화 테크닉으로 보이네요.
저렇게하기위해 8바이트씩 처리하는것일수도 있어보입니다.
loop unrolling 을 찾아보세요.
loop unrolling 을 찾아보세요.
감사합니다
감사합니다
댓글 달기