memcpy 관련 질문
안녕하세요
본사이트를 통해 많은 정보를 얻어가고 있는 한 개발자 입니다.
매번 다른 사람들이 남긴 글만 읽다가 뭔가 테스트를 하던 도중 궁금한 점이 있어서 글남깁니다.
제 질문은 아래의 간단한 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<(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에서도 동일한 결과가 나옵니다.
혹시 위 결과에 대해 알고 계신분이 계시다면 설명 부탁드립니다. ^^
감사합니다.
댓글 달기