memcpy 관련 질문

itdream81의 이미지

안녕하세요

본사이트를 통해 많은 정보를 얻어가고 있는 한 개발자 입니다.

매번 다른 사람들이 남긴 글만 읽다가 뭔가 테스트를 하던 도중 궁금한 점이 있어서 글남깁니다.

제 질문은 아래의 간단한 test code에서 source영역(mp0 ~ mp3)의 data를 destination(mp4~mp7)영역으로 mempcpy()를 수행할 때

왜 source영역을 1/4만 초기화 한 경우와 전체를 초기화 한 경우 memcpy의 수행 속도가 차이가 발생하는 걸까? 입니다.

====================================================================================

#include
#include
#include

#define EXESIZE (1*1024*1024)

unsigned long long getcurtime()
{ struct timespec tv; clock_gettime(CLOCK_MONOTONIC, &tv); return tv.tv_sec*1000000000+tv.tv_nsec;
}
int main(void)
{ char *mp8={0,}; int i; unsigned long long st, et;

for(i=0;i<8;i++) mp[i]=(char*)malloc(EXESIZE); for(i=0;i<(EXESIZE/4);i++) { *(mp0+i) = rand() & 0xff; *(mp1+i) = rand() & 0xff; *(mp2+i) = rand() & 0xff; *(mp3+i) = rand() & 0xff; } for(i=0;i<4;i++) { st = getcurtime(); memcpy(mp4, mp0, EXESIZE); memcpy(mp5, mp1, EXESIZE); memcpy(mp6, mp2, EXESIZE); memcpy(mp7, mp3, EXESIZE); et = getcurtime(); printf(“loop[%d] : %llu\n”, i, et-st); } return 0; }

================================================================================

위 코드에서 빨간색으로 표시된 부분이

for(i=0;i<(EXESIZE/4);i++) 일때

결과

sbhan@sbhan-linux:~/work/test$ ./mem_test
loop0 : 1662264
loop1 : 214857
loop2 : 195523
loop3 : 184252
sbhan@sbhan-linux:~/work/test$ ./mem_test
loop0 : 1637931
loop1 : 174388
loop2 : 158827
loop3 : 180694
sbhan@sbhan-linux:~/work/test$ ./mem_test
loop0 : 1746765
loop1 : 184685
loop2 : 170903
loop3 : 168586

위 코드에서 빨간색으로 표시된 부분이

for(i=0;i<(EXESIZE);i++) 일때

결과

sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop0 : 1490597
loop1 : 494506
loop2 : 431065
loop3 : 333235
sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop0 : 1440975
loop1 : 402830
loop2 : 356930
loop3 : 340288
sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop0 : 1436795
loop1 : 395757
loop2 : 353843
loop3 : 337860

위와 같은 결과가 나옵니다.

결과에서 첫번째 루프에서는 sorurce와 destination 모두에서 fault가 발생하기 때문에 시간이 오래 걸리는 것은 이해할 수 있지만

왜 loop 1,2,3에서 2가지 경우의 수행시간이 차이가 생기는 걸까요?

결과만 놓고 봤을 때 마치 1/4만 초기화한 code의 경우 실제로 memcpy가 1/4만 수행되는 것처럼 보이는데 정말 이게 맞는 걸까요?

위의 결과와 같은 패턴은 desk top 뿐만 아니라 android phone에서도 동일한 결과가 나옵니다.

혹시 위 결과에 대해 알고 계신분이 계시다면 설명 부탁드립니다. ^^

감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.