Время, необходимое для memcpy уменьшается после определенного момента - PullRequest
4 голосов
/ 02 апреля 2012

У меня есть код, который экспоненциально увеличивает размер памяти (идентифицируемой указателем).
Вместо realloc() я использую malloc(), за которым следует memcpy() ...

int size=5,newsize;
int *c = malloc(size*sizeof(int));
int *temp;

while(1)
{
   newsize=2*size;
   //begin time
   temp=malloc(newsize*sizeof(int));
   memcpy(temp,c,size*sizeof(int));
   //end time
   //print time in mili seconds
   c=temp;
   size=newsize;
}

Таким образом, количество копируемых байтов увеличивается в геометрической прогрессии.

Время, необходимое для выполнения этой задачи, также увеличивается почти линейно с увеличением размера. Однако после определенного момента время, которое происходит внезапно, уменьшается до очень малого значения и затем остается постоянным.

Я записал время для аналогичного кода, копируя данные моего собственного типа.

5 -> 10  - 2 ms  
10 -> 20  - 2 ms  
.  
.  
2560 -> 5120 - 5 ms  
.  
.  
20480 -> 40960 - 30 ms  
40960 -> 91920 - 58 ms  
367680 -> 735360 - 2 ms  
735360 -> 1470720 - 2 ms  
1470720 -> 2941440 - 2 ms

В чем причина этого падения во времени? Призывается ли более оптимальный метод memcpy при большом размере?

Ответы [ 2 ]

6 голосов
/ 02 апреля 2012

Поскольку ваш код не выполняет free() в старом блоке памяти, убедитесь, что новые выделения просто не начнут давать сбой.Может случиться так, что memcpy() выдает ошибку при указании NULL-указателя, поэтому завершается очень быстро.

2 голосов
/ 02 апреля 2012

Вы проверили возвращаемые значения malloc?

Я думаю, что это просто дает сбой после определенной точки.

...