2012-04-02 3 views
4

メモリ(ポインタで識別される)のサイズを指数関数的に増加させるコードがあります。
代わりのrealloc()は、私がこのようにコピーされたばかりのバイト数が指数関数的に増加しているmemcpy() ...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; 
} 

続いmalloc()を使用しています。

この作業に必要な時間も、サイズの増加に伴ってほぼ直線的に増加します。しかし、特定の時点の後に、急に取られた時間は非常に小さい値に減少し、その後も一定のままです。

私は自分のタイプのデータをコピーする同様のコードの時間を記録しました。

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メソッドが呼び出されますか?

+5

いいえメモリリーク... – Macmade

答えて

6

古いメモリブロックでコードでfree()を実行しないため、新しい割り当てが失敗しないようにしてください。 NULLポインタが与えられたときにmemcpy()のエラーが出力され、非常に迅速に完了することがあります。

+1

2倍に5倍(または質問に示されているように無限大)が実際には非常に大きなサイズを非常に迅速に配信します。どれくらい自由にしても、許容される最大ブロックサイズにすばやく到達し、mallocも本当に速く戻るようになります。 – TheBlastOne

+0

ありがとうございます。これが理由であるかもしれませんが、確認してください。 – tss

2

mallocの戻り値を確認しましたか?

ある時点以降はちょうど失敗すると思います。

関連する問題