본문 바로가기
컴퓨터일반

C/C++ memcpy() 함수 속도

by __observer__ 2012. 7. 16.
반응형

C/C++ 에서 메모리 복사를 위해서 사용하는 함수로 memcpy() 함수가 있습니다.

 

for 나 while 과 같은 루프를 이용해서 메모리를 복사 할 수 도 있지만, memcpy() 함수를 이용하는 것이 속도 면에서 월등히 빠르다고 하더군요.

 

그래서 오늘 포스팅에서는 memcpy() 와 루프 문을 이용한 메모리 복사의 속도 비교를 해 보려 합니다.

 

memcpy() 함수는 string.h 에 정의 되어 있고 그 원형은 다음과 같습니다.

 

void * memcpy ( void * destination, const void * source, size_t num );

 

source 에서 destination 으로 num 만큼을 복사 하는 간단한 형태입니다.

 

비교를 위해서 배열의 크기에 따른 시뮬레이션을 수행해 봤고, 시험 횟수는 1000000 회를 수행해서 메모리 복사에 걸리는 시간들의 평균을 구해 봤습니다.

 

코드는 다음과 같습니다.

 

#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, sum_time;

    unsigned k, i;

    unsigned N_sim, N_buffer;

 

    ofstream fout("abc.txt");

    N_sim=1000000;

 

    int * test1;

    int * test2;

 

    int N;

    for (N=10;N<17;N++)

    {

        N_buffer=(unsigned)pow(2,N);

 

        test1 = new int[N_buffer];

        test2 = new int[N_buffer];

 

        // use for loop

        sum_time=0;

        for (k=0;k<N_sim;k++)

        {

            time(&start); // start time

            for (i=0;i<N_buffer;i++)

            {

                test1[i]=test2[i];

            }

            time(&end);

            dif = difftime(end,start);

            sum_time+=dif;

        }

        average_time=sum_time/(double)N_sim;

 

 

        // use memcpy

        sum_time=0;

        for (k=0;k<N_sim;k++)

        {

            time(&start); // start time

            memcpy(test2, test1,N_buffer*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 << endl;

        cout << N_buffer << "\t" << average_time << "\t" << average_time1 << endl;

 

        delete []test1;

        delete []test2;

    }

 

    fout.close();

    return 0;

}

 

시뮬레이션 시간을 측정 해보니 실제로 시간 차이가 꽤 많이 나더군요.

 

컴퓨터 성능에 따라 차이는 있겠지만, 제 컴퓨터의 경우 for 루프를 이용한 경우에 비해 memcpy() 함수를 이용한 경우가 거의 5 배 정도 빠르다는 것을 알 수 있었습니다.






반응형

댓글