1. Cache와 main memory의 속도 비교:
Array에 data를 access하는 시간을 통해 비교하였다.
Array는 메모리에 연속적으로 할당이 되고, Array에 data를 access할 때 일정 크기만큼 cache에 올라가기 때문에 array 순서대로 참조할 경우 cache에 올라간 값을 access 한다. 하지만 비연속적인 참조를 할 경우 cache에 올라간 값이 아니기 때문에 main memory에 access하게 된다.
windows 버전
Code #include <stdio.h>#include <time.h>#include <windows.h>#define SIZE 10000#define CHECK_TIME_START QueryPerformanceFrequency ((_LARGE_INTEGER*)&freq); QueryPerformanceCounter((_LARGE_INTEGER*)&start)#define CHECK_TIME_END(a) QueryPerformanceCounter((_LARGE_INTEGER*)&end); a=(float)((float) (end - start)/freq)int a[SIZE][SIZE];void main() { __int64 start, freq, end; float resultTime=0; printf("시작\n"); CHECK_TIME_START; for(int i=0;i<SIZE;i++){ for(int j=0;j<SIZE;j++){ a[j][i] = 0; } } CHECK_TIME_END(resultTime); printf("끝 %f ",resultTime); CHECK_TIME_START; for(int i=0;i<SIZE;i++){ for(int j=0;j<SIZE;j++){ a[i][j] = 0; } } CHECK_TIME_END(resultTime); printf("끝 %f ",resultTime);}
리눅스 버전:
Code #include <stdio.h>//#include <time.h>//#include <windows.h>#include <sys/time.h>#define SIZE 10000long timecacul () { struct timeval tv; struct timezone tz; gettimeofday(&tv,&tz); return (tv.tv_sec * 1000 + tv.tv_usec / 1000);}int a[SIZE][SIZE];void main() { long starttime, endtime, resultTime; int i, j; printf("시작\n"); starttime = timecacul (); for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ a[j][i] = 0; } } endtime = timecacul (); resultTime = endtime -starttime; printf("끝 %ld ",resultTime); starttime = timecacul (); for(i=0;i<SIZE;i++){ for(j=0;j<SIZE;j++){ a[i][j] = 1; } } endtime = timecacul (); resultTime = endtime -starttime; printf("끝 %ld ",resultTime);}
소스 코드 설명
10000 x 10000의 배열에 0을 넣는 시간을 측정한다. 두 가지 방법으로 넣는데, 위쪽 for loop 에서는 메모리에 비연속적으로 0을 넣고 있고(a[j][i] = 0;) 아래쪽 for loop에서는 메모리에 연속적으로 0을 넣고 있다 (a[i][j] = 0;).
Ubuntu9.10에서 돌린 결과:
rize@rize-laptop:~/end$ ./os
시작끝 5334 끝 414
2. main memory 와 Magnetic disk의 속도 비교:
Sqlite디비를 메인 메모리와 하드 디스크에서 돌려서 시간 측정한다.