T
Hi,
habe bezüglich den Performanceunterschieden zwischen Vector und Deque mal folgendes Testprogramm geschrieben:
#include <VECTOR>
#include <deque>
#include <iostream>
#include <windows.h>
void main()
{
using namespace std;
DWORD starttime, endtime, temp;
double size=10; // bzw. size=100 size=1.000.000 size=100.000
starttime=GetTickCount();
vector <double*> test;
endtime=GetTickCount();
cout << " Benoetigte Zeit zum anlegen des Vectors: " << endtime-starttime << " ms\n";
double temparray[6]={1,2,3,4,5,6};
starttime=GetTickCount();
for (int k=0; k<10000000; k++) // bzw. k<100 k<1000 k<1000000
{
temp=GetTickCount();
for (long i=0; i<size; i++)
test.push_back(temparray);
cout << "Benötigte Zeit für " << k << ". Vector: " << GetTickCount()-temp << " ms\n";
}
endtime=GetTickCount();
cout << " Benoetigte Zeit zum fuellen des Vectors: " << endtime-starttime << " ms\n";
cout << " Capacity: " << test.capacity() << "\n";
cout << " Size: " << test.size() << "\n\n";
cout << "================================================================================\n";
starttime=GetTickCount();
deque <double*> test2;
endtime=GetTickCount();
cout << " Benoetigte Zeit zum anlegen der Deque: " << endtime-starttime << " ms\n";
starttime=GetTickCount();
for (k=0; k<1000000; k++) // bzw. k<100 k<1000 k<1000000
{
temp=GetTickCount();
for (long i=0; i<size; i++)
test2.push_back(temparray);
cout << "Benötigte Zeit für " << k << ". Deque: " << GetTickCount()-temp << " ms\n";
}
endtime=GetTickCount();
cout << " Benoetigte Zeit zum fuellen der Decue: " << endtime-starttime << " ms\n";
cout << " Size: " <<test2.size() << "\n\n";
}
Die Ausgaben (cout << irgendwas) hab ich beim Aufrufen in eine Datei umgeleitet und verschiedene Versionen getestet:
1. 10x 10.000.000 Werte geschrieben:
Benoetigte Zeit zum anlegen des Vectors: 0 ms
Benötigte Zeit für 0. Vector: 451 ms
Benötigte Zeit für 1. Vector: 440 ms
Benötigte Zeit für 2. Vector: 241 ms
Benötigte Zeit für 3. Vector: 741 ms
Benötigte Zeit für 4. Vector: 280 ms
Benötigte Zeit für 5. Vector: 271 ms
Benötigte Zeit für 6. Vector: 26848 ms <-- Was zur Hölle ist das????
Benötigte Zeit für 7. Vector: 260 ms
Benötigte Zeit für 8. Vector: 271 ms
Benötigte Zeit für 9. Vector: 270 ms
Benoetigte Zeit zum fuellen des Vectors: 30083 ms
Capacity: 134217728
Size: 100000000
Benoetigte Zeit zum anlegen der Deque: 0 ms
Benötigte Zeit für 0. Deque: 3245 ms
Benötigte Zeit für 1. Deque: 4887 ms
Benötigte Zeit für 2. Deque: 5428 ms
Benötigte Zeit für 3. Deque: 4657 ms
Benötigte Zeit für 4. Deque: 4687 ms
Benötigte Zeit für 5. Deque: 4656 ms
Benötigte Zeit für 6. Deque: 4076 ms
Benötigte Zeit für 7. Deque: 4026 ms
Benötigte Zeit für 8. Deque: 4116 ms
Benötigte Zeit für 9. Deque: 3185 ms
Benoetigte Zeit zum fuellen der Decue: 43683 ms
Size: 100000000
2. 100x 1.000.000 Werte geschrieben (gekürzt):
...
Benötigte Zeit für 63. Vector: 20 ms
Benötigte Zeit für 64. Vector: 40 ms
Benötigte Zeit für 65. Vector: 30 ms
Benötigte Zeit für 66. Vector: 30 ms
Benötigte Zeit für 67. Vector: 45385 ms <-- schon wieder
Benötigte Zeit für 68. Vector: 20 ms
Benötigte Zeit für 69. Vector: 30 ms
Benötigte Zeit für 70. Vector: 20 ms
Benötigte Zeit für 71. Vector: 20 ms
Benötigte Zeit für 72. Vector: 30 ms
Benötigte Zeit für 73. Vector: 20 ms
...
Benötigte Zeit für 30. Deque: 521 ms
Benötigte Zeit für 31. Deque: 511 ms
Benötigte Zeit für 32. Deque: 510 ms
Benötigte Zeit für 33. Deque: 531 ms
Benötigte Zeit für 34. Deque: 511 ms
Benötigte Zeit für 35. Deque: 511 ms
Benötigte Zeit für 36. Deque: 510 ms
Benötigte Zeit für 37. Deque: 521 ms
Benötigte Zeit für 38. Deque: 20 ms
Benötigte Zeit für 39. Deque: 511 ms
Benötigte Zeit für 40. Deque: 521 ms
Benötigte Zeit für 41. Deque: 20 ms
Benötigte Zeit für 42. Deque: 521 ms
Benötigte Zeit für 43. Deque: 520 ms
Benötigte Zeit für 44. Deque: 511 ms
...
Bei 1000x 100 Werten (Weitere Kombinationen kann man auch austesten) hat sich ähnliches gezeigt. Es waren immer beim Vector ziemliche Ausreißer nach oben dabei (Ok mir ist schon klar, daß beim Vergrößern des Vectors dieser komplett kopiert werden muß, aber 36 sec. sind trotzdem etwas viel). Bei der Deque schwanken die Werte zwischen 0 und 500ms (konstant aber da die meisten Werte bei ca 500ms liegen auch etwas langsam).
Wenn ich einfach in einer Schleife schreibe (war mein erster Test) ist die Performance bei ca 30 Mio Werten gleich (bei kleineren Größen ist die Deque schneller bzw. konstanter, aber das ist mir klar).
Jetzt meine Fragen:
Kann mir jemand erklären woher die Ausreißer kommen (Selbst wenn ausgelagert werden müsste sollte das doch schneller gehn, wir verwenden ja schließlich keine Lochkarten mehr )?
Deque ist mit 500ms auch teilweise etwas langsam (ok. bei 1mio Werten is des eigentlich schon ok, tritta aber teilweise auch bei Weniger Werten auf), allein an der Ausgabe kann das doch nicht liegen oder?
Generell denke ich daß ich mit der Deque besser (weil konstantere Speicherzeiten) fahre, und werde das dann mal mit der Deque implementieren.
PS. Die Compilerkonfiguration ist 'Release', im 'Debug'-Modus kann man das schon nur noch über Nacht laufen lassen!
PPS. Getestet mit VC98 auf mehreren Rechnern
Wie immer im Voraus besten Dank und schönes Wochenende!!!
Gruß
Threaddy