memcmp, memcpy 에 대한 질문
글쓴이: declspec / 작성시간: 수, 2011/09/14 - 8:13오후
100KB 짜리 버퍼가 있는데
여기 있는 내용을 memcpy 를 이용해서
다른 버퍼에 함수호출 한번해서 복사하는것하고
1byte 짜리 char 형 변수를 하나 두고
버퍼를 char 형 배열로 본다음에
루프를 돌면서 1바이트씩 읽어서 다른쪽 버퍼로 직접
a[i] = b[i]; 식으로 옮기는 거랑
어떤 차이가 있나요?
memcpy 가 더 빠를까요?
빠르다면 왜 빠를까요?
마찬가지로 메모리 내용을 비교할때 memcpy 로 비교하는것이
직접 == 연산자를 써서 변수에 1~4바이트씩 담아서
비교하는것보다 빠른가요?
그리고 윈도우 API 의 BitBlt 함수를 사용할때
크기 100짜리의 그림을 DC 에 복사하는데 1의 시간이 걸린다면
크기 1000짜리의 그림을 DC 에 복사하려면 10의 시간이 걸릴까요?
BitBlt 함수를 이용해서 비트맵 버퍼에 있는것을
DC 버퍼로 옮기는 것은(메모리DC로) memcpy 보다 빠를까요? 느릴까요? 비슷할까요?
질문이 많지만 정말 궁금합니다~
Forums:
1) 프로그램이 메모리를 읽거나 쓸때는 1Byte씩이
1) 프로그램이 메모리를 읽거나 쓸때는 1Byte씩이 아니고 register의 크기 (4bytes, 8bytes 등)만큼하기 때문에
1byte씩 처리하기 위해서는 일단 register에 내용을 채우고 또다시 byte씩 처리해야 하기 때문에
1byte씩 처리하는 것이 훨씬 느릴꺼 같습니다.
2) memory를 비교하는 것은 type의 개념이 없이 해당주소에 있는 메모리의 내용이 동일한지 보는 것이고,
( a == b ) 는 a 와 b의 값이 같은 지 비교하는 것으로 a와 b의 type에 맞는
operator '==' 가 정의되어 있어야 합니다.
3) 먼저 그 그림이 어디 있는냐에 따라서 빠르다 늦다가 달라집니다. (디스크 / 캐시 / 메모리 / ..)
고려해야 될 사항은,
- 디스크 I/O 는 page 단위로 처리가 된다.
- 초기 access, 즉 원하는 이미지의 맨처음 위치를 읽어 오는 시간 과
- 이미지 내에서의 sequential read는 속도 차이가 많다.
즉, (정확한 수치야 매번 다르겠지만) 100byte를 읽어오는 시간과 1000byte를 읽어오는 시간은
꼭 10배가 걸리는 것이 아니고, A(시작지점 data access) + B(sequential access time) 에서
A가 B보다 상대적으로 아주 크다고 보면, 두 경우의 시간적 차이는 크지 않을 거라고 생각됩니다.
만약, 5Mbytes 하고 50Mbytes를 비교하면 이미지 크기에 비례하여 시간차가 나지 않을까 합니다.
편한대로 하세요.
궁금하신 거면 실험해보세요.
실험결과가 이해가 안 가신다면 그 실험과정과 결과를 가지고 다시 질문하시기 바랍니다.
실험결과
실험을 해보니
= 나 == 연산자를 직접 써서 일일히 하는거보다
memcpy, memcmp 가 훨씬 빠르네요
80MB 의 버퍼에 대해서
1바이트씩 = 를 써서 옮긴것과
한번에 memcpy 한것과 속도가
수십배정도 차이났습니다.
== 연산과 memcmp 도 마찬가지이구요
그 내부적인 이유는 실험으로 알수없으니
궁금하군요
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
Compiler 마다 다르겠습니다만...
퉁명스런 대답을 따라주셔서 제가 찾아보고 답변하지 않을 수가 없었네요. ^_^
우선 http://ftp.gnu.org/gnu/glibc/ 를 보시면 Linux memcpy source 를 확인하실 수 있습니다.
정확히 확인해본 것은 아닙니다만 memcpy와 memcmp의 성능이 월등한 이유는 Assembly로 작업되어 SIMD를 활용했기 때문일 겁니다.
gcc 소스 코드를 한번 보세요.
memcpy, memcmp 가 어떻게 구현되어 있는지 검토하시면 도움을 될 것 같습니다.
1바이트씩 해보셨으니 unsigned int 타입으로
1바이트씩 해보셨으니
unsigned int 타입으로 해보시는것도 좋을 듯 하네요.
그리고 little endian / big endian 를 찾아보시면, 힌트가 조금은 될 것 같네요.
-----------------
한글을 사랑합니다.
댓글 달기