지난 포스팅에서 memmove() 함수를 이용한 memory shift 실험을 수행했었는데~
2012/08/06 - [컴퓨터일반] - C/C++ memmove() 함수 속도 실험
memmove() 함수의 속도가 for 문을 이용했을 경우에 비해 그리 빠르지 않은 것을 확인했었습니다.
그래서 계속 찾다 보니 C++ STL 에 deque 가 있더군요.
디지털 필터 설계시의 memory shift 는 이전 신호는 없애고 현재의 신호가 끝에 들어가는 동작이 반복되기 때문에 C++ STL 의 deque 가 적격이라고 생각되는군요.
그래서 얼마나 빠른지 다시 한번 실험을 해봤습니다.
본 실험은 컴퓨터 성능에 따라 다르겠지만 for 문, memmove(), deque 사용에 따른 상대적인 속도 차이를 비교하기 위한 것입니다.
이전에 사용했던 코드에 다음과 같이 deque 부분을 추가했습니다.
실험 결과는다음과 같은데요…디지털 필터 설계시에는 deque 가 진리인 듯…. 의견있으신 분들은 리플 부탁요~
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <fstream>
#include <math.h>
#include <deque>
using namespace std;
int main()
{
time_t start,end;
double dif, average_time,average_time1, average_time2, sum_time, average_time_deque;
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];
deque<int> dequeBuffer(N_buffer,0); // deque buffer initialization
// 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;
// use deque
sum_time=0;
for (k=0;k<N_sim;k++)
{
time(&start); // start time
dequeBuffer.pop_front();
dequeBuffer.push_back(100);
time(&end);
dif = difftime(end,start);
sum_time+=dif;
}
average_time_deque=sum_time/(double)N_sim;
fout << fixed;
fout.precision(10);
fout << N_buffer << "\t" << average_time << "\t" << average_time1 << "\t" << average_time2 << "\t" << average_time_deque <<endl;
cout << fixed;
cout.precision(10);
cout << N_buffer << "\t" << average_time << "\t" << average_time1 << "\t" << average_time2 << "\t" << average_time_deque <<endl;
delete []test1;
}
fout.close();
return 0;
}
'컴퓨터일반' 카테고리의 다른 글
KMPlayer 깔 때 짜증나는 것들... (0) | 2012.10.21 |
---|---|
간단하게 동영상 codec 정보 알아보기 (0) | 2012.10.14 |
CodeBlock 에서 FFTW 라이브러리를 사용한 FFT 실습 (281) | 2012.08.26 |
C++11 많이 좋아졌네요. (0) | 2012.08.26 |
자바 환경변수 설정 (0) | 2012.08.11 |
C/C++ memmove() 함수 속도 실험 (4) | 2012.08.06 |
Codeblock 에서 DLL 사용하기 (0) | 2012.07.31 |
C/C++ memcpy() 함수 속도 (0) | 2012.07.16 |
댓글