Heap Performance
-
Ich sehe gerade, Gregor hat keine straight-forward java Version gepostet. Die möchte ich auch sehen.
-
Original erstellt von Mr. N:
Ich sehe gerade, Gregor hat keine straight-forward java Version gepostet. Die möchte ich auch sehen.Was meinst du?
-
Original erstellt von Gregor:
Was meinst du?Nix
Das mit dem Array auf den Heap find ich nur gewöhnungsbedürftig.Hmm. Dieser Code:
for (i = 100000; i > 0; --i) for (int j = 0; j < 5000000; ++j) sum = (sum + sum % 4) % 6;
Rechnet ziemlich lange. Mal sehen, ob die Zahlen in Gregors Progrämmchen stimmen.
-
Hehe. Versehentlich j++ statt j += i;
-
Das guut Code sei:
#include <iostream> #include <ctime> #include <cstdlib> #include <cassert> using namespace std; int main() { const int size = 1000; static int *array[size]; const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 }; int length[size] = {0}; unsigned long sum = 0; clock_t time = clock(); int i; for (i = 0; i < size; ++i) { int s = i % 10; array[i] = new int[s]; length[i] = s; for (int j = 0; j < s; ++j) array[i][j] = j; } for (i = 1; i < 100000; ++i) for (int j = 0; j < 5000000; j += i) { int element = j % size; int k; for (k = 0; k < length[element]; ++k) sum += array[element][k]; delete [] array[element]; array[element] = new int[ length[element] = sizes[i % 7] ]; for (k = 0; k < length[element]; ++k) array[element][k] = k; } for (i = 10; i < size; ++i) { delete [] array[i]; array[i] = new int[ length[i] = length[i % 10] ]; memcpy(array[i], array[i % 10], length[i]); } for (i = 100000; i > 0; --i) for (int j = 0; j < 5000000; j += i) { int element = j % size, k; for (k = 0; k < length[element]; ++k) sum += array[element][k]; delete [] array[element]; array[element] = new int[ length[element] = sizes[i % 7] ]; for (k = 0; k < length[element]; ++k) array[element][k] = k; } cout << clock() - time << " ms (or usec)" << endl; cout << sum << endl; return 0; }
-
Output:
26906 ms (or usec) 3963054733
27 Sekunden. Unhandoptimiert
-
...und bei mir kommt mit "j += i" folgendes heraus :
144 Sekunden, 1054756072
Weder dein Ergebnis, noch dieses hier stimmt mit dem der Vorgabe überein! ...scheint also doch nicht so ganz straight-Forward zu sein, gell?
-
Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein!
-
Original erstellt von <clock clock>:
Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein!???
-
Original erstellt von <clock clock>:
Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein!Warum? Zu ungenau? Hier interessieren doch eh nicht die Millisekunden.
-
funktion, die die laufzeit des programms wiedergibt
Da steht was davon, das auch minütliche Unterschiede entstehen können
-
Nicht bei unseren Programmen.
-
MrN--;
-
Original erstellt von < >:
MrN--;Öhm. Meine Antwort ist doch nicht gelogen, oder irgendwie falsch? Wie soll ich das verstehen? Als persönlichen, ungerechtfertigten Angriff?
-
Als unoptimierte! Abwertung.
-
@Gregor: auf was ist sum nach jedem Beenden einer for (i...) schleife gesetzt?
/me kriegt für das hier#include <iostream> #include <ctime> #include <cstdlib> #include <cassert> using namespace std; int main() { const int size = 1000; static int *array[size]; const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 }; int i, j, k, element; int length[size] = {0}; unsigned long sum = 0; clock_t time = clock(); for (i = 0; i < size; ++i) { int s = i % 10; array[i] = new int[s]; length[i] = s; for (j = 0; j < s; ++j) array[i][j] = j; } cout << sum << endl; 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]; delete [] array[element]; array[element] = new int[ length[element] = sizes[i % 7] ]; for (k = 0; k < length[element]; ++k) array[element][k] = k; } cout << sum << endl; for (i = 10; i < size; ++i) { delete [] array[i]; array[i] = new int[ length[i] = length[i % 10] ]; memcpy(array[i], array[i % 10], length[i]); } cout << sum << endl; for (i = 100000; i > 0; --i) for (j = 0; j < 5000000; j += i) { element = j % size, k; for (k = 0; k < length[element]; ++k) sum += array[element][k]; delete [] array[element]; array[element] = new int[ length[element] = sizes[i % 7] ]; for (k = 0; k < length[element]; ++k) array[element][k] = k; } cout << sum << endl; cout << clock() - time << " ms (or usec)" << endl; cout << sum << endl; return 0; }
folgenden output:
0 2369722731 2369722731 3765571316 26718 ms (or usec) 3765571316
-
Original erstellt von < >:
Als unoptimierte! Abwertung.Tut mir leid, da ich nicht verstehe, warum, kann ich _diese_ Erklärung nicht akzeptieren.
-
Es gibt Überläufe, die aber wohl auf bei beiden Programmen gleich sein sollten:
0
-1925244565
-1925244565
56411 ms
444560896
-
@Gregor: bei dir fehlt da noch eins :). unsigned weg und:
0 -1925244565 -1925244565 -529395980 28296 ms (or usec) -529395980
wo der fehler (?) liegen müsste, is jetz klarer
-
Dieser Code, macht der das gleiche wie dein arraycopy? Kannst du das Arraycopy nich auch selber schreiben?
for (i = 10; i < size; ++i) { delete [] array[i]; array[i] = new int[ length[i] = length[i % 10] ]; memcpy(array[i], array[i % 10], length[i]); }
[ €dit: Zu früh geklickt ]
[ Dieser Beitrag wurde am 03.12.2002 um 18:27 Uhr von Mr. N editiert. ]