본문 바로가기
컴퓨터일반

deque 이용 Memory shift 실험

by __observer__ 2012. 8. 15.
반응형

지난 포스팅에서 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;

}


반응형

댓글