Heap Performance
-
Das mit dem 1 GB ist jetzt behoben, jetzt kommt nur noch ne Access-Violation.
-
@Gregor: Hätte dir deine dumme Idee nicht früher einfallen können? Guck mal:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; /* Analysis: Occurences of 'new's: 0: 100 1: 100 2: 14506287 3: 24201675 4: 100 5: 18946842 6: 100 7: 17061342 8: 100 9: 100 11: 16037221 13: 15367557 17: 14882188 */ int *Xfree[18] = { 0 }; int Xu[18] = { 0 }; inline int *Xnew(size_t size) { if (size < 1 || size > 17 || !Xfree[size]) return new int[size]; int *result = Xfree[size]; Xfree[size] = * (int **) Xfree[size]; --Xu[size]; return result; } inline void Xdel(int *p, size_t size) { if (size < 1 || size > 17) { delete [] p; return; } int *x = Xfree[size]; *(int **)p = x; x = p; if (++Xu[size] > 8192) { int i = 0; while (*x) { p = x; x = * (int **) x; delete [] p; cout << i << ": " << p << endl; i++; } Xu[size] = 0; } Xfree[size] = x; } int main() { const int size = 1000; int *array[size]; const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 }; int i, j, k, element; size_t length[size] = {0}; long sum = 0; clock_t time = clock(); for (i = 0; i < size; ++i) { int s = i % 10; array[i] = Xnew(s); length[i] = s; for (j = 0; j < s; ++j) array[i][j] = j; } for (i = 1; i < 100000; ++i) for (j = 0; j < 5000000; j += i) { element = j % size; for (k = 0; k < length[element]; ++k) sum += array[element][k]; Xdel(array[element], length[element]); array[element] = Xnew( length[element] = sizes[i % 7] ); for (k = 0; k < length[element]; ++k) array[element][k] = k; } int *ref[size]; int _ref[size] = { 0 }; for (i = 0; i < 10; ++i) { ref[i] = &_ref[i]; ++*ref[i]; } for (i = 10; i < size; ++i) { //Xdel(array[i], length[i]); array[i] = array[i % 10]; length[i] = length[i % 10]; ref[i] = ref[i % 10]; ++*ref[i]; } for (i = 100000; i > 0; --i) for (j = 0; j < 5000000; j += i) { element = j % size; for (k = 0; k < length[element]; ++k) sum += array[element][k]++; if (--*ref[element] <= 0) { Xdel(array[element], length[element]); } array[element] = Xnew( length[element] = sizes[i % 7] ); ref[element] = &_ref[element]; _ref[element] = 1; for (k = 0; k < length[element]; ++k) array[element][k] = k; } cout << clock() - time << " ms (or usec)" << endl; cout << sum << endl; return 0; }
Wird ein unglültiges Dingsie gefreed.
-
Ich kriege leider noch einen Fehler bei der Ausführung:
Die Anweisung in "0x77f42e9d" verweist auf Speicher in "0x00000001". Der Vorgang "written" konnte nicht auf dem Speicher...
Funktioniert der Code bei dir schon?
-
Hmm, mit dem g++ testen tu. Aber schau doch, was ich direkt unter den Code gepostet hab.
-
Du hast ja mal nen komischen Rechner. Mein g++-Prog (2.95, 3.2 tut nich) spuckt nur Segfault aus.
-
Original erstellt von Mr. N:
Du hast ja mal nen komischen Rechner. Mein g++-Prog (2.95, 3.2 tut nich) spuckt nur Segfault aus.Das war ne Fehlermeldung, die von Windows kam!
-
Aber ich muss zugeben, dass ich den Überblick verloren hab. Du bist wie ein typischer unwissender Kunde ;). Mit Ideen, die ins bereits hochoptimierte Konzept reinsollen :p.
-
Original erstellt von Mr. N:
Du bist wie ein typischer unwissender Kunde ;). Mit Ideen, die ins bereits hochoptimierte Konzept reinsollen :p....und als typischer Kunde bin ich natürlich "menschlich enttäuscht", wenn du den Fehler nicht wegkriegst!
-
Menno :D. Aber erstmal hat anderes Priorität. Mal schaun ob ich n Challenge für dich find.