본문 바로가기
컴퓨터일반

C/C++ memmove() 함수 속도 실험

by __observer__ 2012. 8. 6.
반응형

이전 포스팅에서 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;

}

 

결과는 이렇게 나오더군요.


memmove  속도 실험

 

실험 결과에서 배열의 높은 인덱스에서 낮은 인덱스로 복사 할 때의 경우에는 for 문을 사용할 때보다 오히려 속도가 느리더군요.

 

배열의 낮은 인덱스에서 높은 인덱스로 복사 할 때는 아주 약간 빠르긴 한데 그리 체감 할 정도는 아닌 것 같습니다.

 

지난 실험에서 memcpy() 함수가 for 문을 사용할 때에 비해 약 5 배 정도 빨랐던 것 같은데 C/C++ 로 memory shift 를 구성할 때 메모리를 하나 더 둬서 memcpy() 함수를 사용하는 것이 속도 면에서는 더 좋을 수 도 있겠다는 생각이 드는군요.

 

의견 있으신 분들은 댓글 남겨 주세요.


반응형

댓글