이전 포스팅에서 memcpy() 함수와 for 문을 이용한 메모리 복사의 속도 실험을 해 본적이 있었는데요.
2012/07/16 - [컴퓨터일반] - C/C++ memcpy() 함수 속도
오늘은 그 연장선으로 memmove() 함수의 속도 실험을 수행해 봤습니다.
memcpy() 함수는 인자로 들어가는 두 메모리가 다른 주소여야 하지만
다음과 같은 정의의 memmove() 함수는 source 와 destination 이 같은 주소여도 상관이 없는 것으로 알고 있습니다.
void * memmove ( void * destination, const void * source, size_t num );
즉 memmove() 함수는 소스가 겹쳐지는 부분에 대해 내부적으로 고려를 해주는 뭔가가 더 들어간다는 거죠.
디지털 필터를 설계 할 때 memory shift 구현에 memmove() 를 사용하는 것이 좋을 것 같다는 생각이 들더군요.
그래서 다음과 같이 속도 실험을 해 봤습니다.
for 문을 사용할 때, 배열의 높은 인덱스에서 낮은 인덱스로 복사 할 때, 배열의 낮은 인덱스에서 높은 인덱스로 복사 할 때, 이렇게 세가지 경우에 대해 비교해 봤는데, 생각보다 속도가 빠르진 않더군요.
실험 코드는 다음과 같이 작성했습니다.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
time_t start,end;
double dif, average_time,average_time1, average_time2, sum_time;
unsigned k, i;
unsigned N_sim, N_buffer;
ofstream fout("abc.txt");
N_sim=1000000;
int * test1;
int N;
for (N=10;N<17;N++)
{
N_buffer=(unsigned)pow(2,N);
test1 = new int[N_buffer];
// use for loop
sum_time=0;
for (k=0;k<N_sim;k++)
{
time(&start); // start time
for (i=1;i<N_buffer;i++)
{
test1[i-1]=test1[i];
}
time(&end);
dif = difftime(end,start);
sum_time+=dif;
}
average_time=sum_time/(double)N_sim;
// use memmove, Low to High
sum_time=0;
for (k=0;k<N_sim;k++)
{
time(&start); // start time
memmove(test1+1, test1,(N_buffer-1)* sizeof(int));
time(&end);
dif = difftime(end,start);
sum_time+=dif;
}
average_time2=sum_time/(double)N_sim;
// use memmove, High to Low
sum_time=0;
for (k=0;k<N_sim;k++)
{
time(&start); // start time
memmove(test1, test1+1,(N_buffer-1)* sizeof(int));
time(&end);
dif = difftime(end,start);
sum_time+=dif;
}
average_time1=sum_time/(double)N_sim;
fout << N_buffer << "\t" << average_time << "\t" << average_time1 << "\t" << average_time2 << endl;
cout << N_buffer << "\t" << average_time << "\t" << average_time1 << "\t" << average_time2 << endl;
delete []test1;
}
fout.close();
return 0;
}
결과는 이렇게 나오더군요.
실험 결과에서 배열의 높은 인덱스에서 낮은 인덱스로 복사 할 때의 경우에는 for 문을 사용할 때보다 오히려 속도가 느리더군요.
배열의 낮은 인덱스에서 높은 인덱스로 복사 할 때는 아주 약간 빠르긴 한데 그리 체감 할 정도는 아닌 것 같습니다.
지난 실험에서 memcpy() 함수가 for 문을 사용할 때에 비해 약 5 배 정도 빨랐던 것 같은데 C/C++ 로 memory shift 를 구성할 때 메모리를 하나 더 둬서 memcpy() 함수를 사용하는 것이 속도 면에서는 더 좋을 수 도 있겠다는 생각이 드는군요.
의견 있으신 분들은 댓글 남겨 주세요.
'컴퓨터일반' 카테고리의 다른 글
CodeBlock 에서 FFTW 라이브러리를 사용한 FFT 실습 (281) | 2012.08.26 |
---|---|
C++11 많이 좋아졌네요. (0) | 2012.08.26 |
deque 이용 Memory shift 실험 (2) | 2012.08.15 |
자바 환경변수 설정 (0) | 2012.08.11 |
Codeblock 에서 DLL 사용하기 (0) | 2012.07.31 |
C/C++ memcpy() 함수 속도 (0) | 2012.07.16 |
C/C++ 동적 할당 배열 인덱스 1부터 시작하기 (0) | 2012.06.21 |
Perl YouTube download (0) | 2012.06.17 |
댓글