Zeitmessungen sind schwierig, weil Sie herausfinden müssen, warum Ihr Algorithmus langsamer ist. Dies hängt von den Eingabedaten ab (z. B. vorsortierte Daten siehe Why is it faster to process a sorted array than an unsorted array?) oder die Datensatzgröße (passt in L1, L2, L3-Cache, siehe http://igoro.com/archive/gallery-of-processor-cache-effects/).
Das kann Ihre gemessenen Zeiten enorm beeinflussen. Auch die Reihenfolge der Messungen kann eine entscheidende Rolle spielen. Wenn Sie die Sortieralogs in einer Schleife ausführen und jeder von ihnen etwas Speicher zuweist, wird der erste Test höchstwahrscheinlich verlieren. Nicht, weil der Algorithmus minderwertig ist, aber wenn Sie zum ersten Mal auf neu zugewiesenen Speicher zugreifen, wird dies in Ihrem Prozess-Working-Set fehlerhaft sein. Nachdem der Speicher freigegeben wurde, gibt der Heap-Allokator gepoolten Speicher zurück, der eine völlig andere Zugriffsleistung hat. Das wird sehr auffällig, wenn Sie größere (viele MB) Arrays sortieren.
Im Folgenden sind die Touch-Zeiten eines 2 GB-Arrays aus verschiedenen Threads für das erste und zweite Mal gedruckt. Jede Seite (4 KB) des Speichers wird nur einmal berührt.
Threads Size_MB Time_ms us/Page MB/s Scenario
1 2000 355 0.693 5634 Touch 1
1 2000 11 0.021 N.a. Touch 2
2 2000 276 0.539 7246 Touch 1
2 2000 12 0.023 N.a. Touch 2
3 2000 274 0.535 7299 Touch 1
3 2000 13 0.025 N.a. Touch 2
4 2000 288 0.563 6944 Touch 1
4 2000 11 0.021 N.a. Touch 2
// Touch is from the compiler point of view a nop operation with no observable side effect
// This is true from a pure data content point of view but performance wise there is a huge
// difference. Turn optimizations off to prevent the compiler to outsmart us.
#pragma optimize("", off)
void Program::Touch(void *p, size_t N)
{
char *pB = (char *)p;
char tmp;
for (size_t i = 0; i < N; i += 4096)
{
tmp = pB[i];
}
}
#pragma optimize("", on)
wirklich Um die Leistung eines Algorithmus zu beurteilen, genügt es nicht, Zeitmessungen durchzuführen, aber Sie müssen einen Profiler (zB Windows Performance Toolkit kostenlos, VTune von Intel (nicht kostenlos)), um sicherzustellen, dass Sie gemessen haben das Richtige und nicht etwas ganz anderes.
Machen Sie eine Million Messungen und erhalten Sie den Durchschnitt. Es ist wirklich nicht empfehlenswert, die Vorkaufsrechte für ein modernes System abzuschaffen. –
Grundsätzlich ist es eine gute Idee, die Vorkaufsrechte zu deaktivieren. Hast du einen Weg gefunden, das zu erreichen? Ich würde sagen, es ist nicht möglich, also musst du damit leben. Messen mit Vorkaufsrecht ist ziemlich realistisch, denn das hat Ihr Kunde. –
Hallo, vielen Dank für die Kommentare. Nein, ich kenne keine Möglichkeit, die Vorkaufssperre zu deaktivieren. Ich hoffe eigentlich, dass es eine Art Zähler gibt, der sich nur erhöht, wenn mein Code läuft. –