2017-03-12 2 views
1

Ich möchte die Leistung eines Codeblocks mithilfe von QueryPerformanceCounter in Windows messen. Ich würde gerne wissen, ob ich zwischen verschiedenen Läufen etwas tun kann, um gleiche Messungen für die gleichen Daten zu erhalten (ich möchte die Leistung verschiedener Sortieralgorithmen auf verschiedenen Größen von Arrays messen, die pod oder einige benutzerdefinierte Objekte enthalten). Ich weiß, dass der aktuelle Prozess aufgrund von Interrupts oder I/O-Operationen von der Ausführung unterbrochen werden kann. Ich mache keine I/O, also sind es nur Interrupts, die meine Messung beeinflussen können. Ich gehe davon aus, dass der Kernel auch einen Zeitrahmen hat, in dem mein Prozess laufen kann, also denke ich, dass auch mein Proc wegplanen wird.Muss die Vorbelegung während der Leistungsmessung verhindert werden?

Wie können Menschen genaue Messungen durchführen, indem sie die Ausführungszeit eines bestimmten Codeabschnitts messen?

+1

Machen Sie eine Million Messungen und erhalten Sie den Durchschnitt. Es ist wirklich nicht empfehlenswert, die Vorkaufsrechte für ein modernes System abzuschaffen. –

+0

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. –

+0

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. –

Antwort

1

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.

1

Ich bin gerade zu einer Konferenz mit Andrei Alexandrescu auf Fastware gegangen und er hat sich genau mit diesem Thema befasst, wie man die Geschwindigkeit misst. Anscheinend ist es eine schlechte Idee, das Mittel zu bekommen, ABER das viele Male messen ist eine großartige Idee. In diesem Sinne messen Sie eine Million Mal und erinnern sich an die kleinste Messung, weil Sie dort am wenigsten Lärm bekommen. Die Mittel sind schrecklich, weil Sie der tatsächlichen Geschwindigkeit, die Sie messen, mehr Gewicht beisteuern (das sind nicht die einzigen Dinge, die Sie bei der Bewertung der Code-Geschwindigkeit berücksichtigen sollten, aber das ist ein guter Anfang, es gibt sogar einen scheußlichere Dinge darüber, wo der Code ausgeführt wird, und der Overhead, der durch den Code verursacht wird, der die Ausführung auf einem Kern beginnt und auf einem anderen beendet, aber das ist eine andere Geschichte und ich glaube nicht, dass sie auf meine Art zutrifft).

Ein guter Witz: Wenn Sie Bill Gates in einen Bus setzen, im Durchschnitt jeder in diesem Bus ein Millionär ist :))

Beifall und Dank allen, die Eingabe zur Verfügung gestellt.

Verwandte Themen