malloc(0) macht Programm schneller
-
Ich schreibe grade ein paar Funktionen um linked lists zu addieren und bin dabei darauf gestoßen, dass mein Code mit ein paar Zeilen mehr wesentlich schneller ist.
Nach langem rumprobieren scheint es so zu sein, dass dies an einem malloc-Aufruf lag und das funktioniert sogar noch mit malloc(0).
Die Ausführungszeit mit malloc(0) beträgt bei mir etwa 1600 ms, ohne 5000 ms.
So Pi-mal-Daumen kommt die Zeitmessung mit ca 2 sec und 5 sec auch sehr gut hin, also denke ich mal, dass die so richtig ist.
Frage:
Warum ist das hier mit malloc(0) schneller?#include <stdio.h> #define c2i(x) (x-'0') #define i2c(x) (x+'0') typedef struct linkedInt{ int i; struct linkedInt *next; } LI, *PLI; void freeLi(PLI a){ PLI old; while (a){ old = a; a = a->next; free(old); } } void pushLi(PLI *a, int i){ PLI temp = (PLI)malloc(sizeof(LI)); temp->next = *a; temp->i = i; *a = temp; } /* PLI reverseLi(PLI a){ PLI temp = NULL; while (a){ pushLi(&temp, a->i); a = a->next; } return temp; } void printLi(PLI a){ PLI temp = reverseLi(a); while (temp){ printf("%i", temp->i); temp = temp->next; } free(temp); } */ PLI sumLi(PLI a, PLI b){ PLI head = (PLI)malloc(sizeof(LI)); PLI tail = head; int carry = a->i + b->i; head->i = carry%10; carry /= 10; a = a->next; b = b->next; while (a || b || carry){ if (a){ carry += a->i; a = a->next; } if (b){ carry += b->i; b = b->next; } tail->next = (PLI)malloc(sizeof(LI)); tail = tail->next; tail->i = carry%10; tail->next = NULL; carry /= 10; } return head; } PLI newLi(char *c){ PLI temp = NULL; while (*c != '\0') pushLi(&temp, c2i(*c++)); return temp; } int main(){ int t = clock(); int i = 1000000; char buffer[256]; PLI a, b, c; while (i-- > 0){ itoa(rand(), buffer, 10); a = newLi(buffer); itoa(rand(), buffer, 10); b = newLi(buffer); c = sumLi(a, b); malloc(0);//Ohne diese Zeile ist alles langsamer freeLi(a); freeLi(b); freeLi(c);//Außer diese Zeile hier fehlt } printf("duration: %i ms", clock()-t); getchar(); return 0; }
Ich tippe mal darauf, dass ich irgendwo einfach was vergessen habe (ist ja auch schon spät
).
Edit:
Compiler ist gcc mit allen Optimierungen und strip executables aktiviert.
-
Hallo,
ist vieleicht ein Memorydebugger aktiv?
Bei waren die Zeiten nämlich so:
mit malloc(0) 58 Sek.
ohne 75 Sek.Nach dem Deaktivieren des Memorydebuggers waren in beiden Fällen ca. 3,2 Sek Laufzeit gemessen worden.
Ich habe auch keinen Fehler gesehen. Nur nach dem Weglassen des letzten Frees, hat mir der Memorydebugger eine gigantische Errorlogdatei erzeugt.
mfg Martin