2012-04-02 6 views
4

Ich habe einen Code, der die Größe des Speichers (durch einen Zeiger identifiziert) exponentiell erhöht.
Statt realloc() verwende ich malloc() gefolgt von memcpy() ...Die Zeit für Memcpy sinkt nach einem bestimmten Punkt

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; 
} 

So ist die Anzahl der kopierten Bytes immer exponentiell zunimmt.

Die für diese Aufgabe benötigte Zeit steigt ebenfalls fast linear mit der Größenzunahme. Nach einem bestimmten Zeitpunkt reduziert sich die Zeit jedoch schlagartig auf einen sehr kleinen Wert und bleibt dann konstant.

Ich habe Zeit für ähnlichen Code aufgezeichnet, Kopieren von Daten meines eigenen Typs.

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 

Was ist der Grund für diesen Zeitverlust? Wird eine optimalere memcpy-Methode aufgerufen, wenn die Größe groß ist?

+5

Schönes Speicherleck ... – Macmade

Antwort

6

Da Ihr Code free() auf dem alten Speicherblock nicht tut, stellen Sie sicher, dass die neuen Zuordnungen einfach nicht fehlschlagen. Es könnte sein, dass memcpy() Fehler, wenn ein NULL-Zeiger gegeben wird, so sehr schnell abgeschlossen.

+1

Doubling 5 ein paar Mal (oder unendlich, wie in der Frage gezeigt) liefert in der Tat sehr schnell große Größen. Egal, wie viel Sie frei haben, Sie werden schnell die maximale Blockgröße erreichen und malloc zwingen, auch wirklich schnell zurückzukehren. – TheBlastOne

+0

Danke..das könnte der Grund sein, llve zu überprüfen. – tss

2

Haben Sie die Rückgabewerte von malloc überprüft?

Ich denke, es scheitert nur nach einem bestimmten Punkt.

Verwandte Themen