2016-05-03 5 views
1

Beim Testen der Arbeit von benutzerdefinierten Heap-Manager (um System eins zu ersetzen) habe ich einige Verlangsamungen im Vergleich zu System-Heap aufgetreten.Profiler zeigt keine Zeit für Sprünge, aber viel Zeit für Vergleiche

Ich verwendete AMD CodeAnalyst für Profilerstellung x64-Anwendung auf Windows 7, Intel Xeon CPU E5-1620 v2 @ 3,70 GHz. Und bekam die folgenden Ergebnisse:

Profile results

Dieser Block verbraucht etwa 90% der Zeit für die gesamte Anwendung laufen. Wir können eine Menge Zeit auf "cmp [rsp+18h], rax" und "test eax, eax" verbringen, aber keine Zeit auf Sprünge direkt unterhalb der Vergleiche verbracht. Ist es in Ordnung, dass Sprünge keine Zeit brauchen? Liegt es am Verzweigungsvorhersagemechanismus?

änderte ich die Klausel in die entgegengesetzten und hier, was ich habe (die Ergebnisse etwas anders in absoluten Zahlen, weil ich manuell gestoppt Sitzungen Profilieren - aber immer noch eine Menge Zeit durch vergleichen genommen wird): enter image description here

Es gibt so viele Aufrufe an diese Vergleiche, dass sie zu einem Flaschenhals werden ... So kann ich diese Ergebnisse interpretieren. Und wahrscheinlich ist die beste Optimierung die Überarbeitung des Algorithmus, richtig?

+0

Ich habe es geschafft, den Algorithmus zu verbessern, jetzt benutzerdefinierte Heap ist von der gleichen Geschwindigkeit wie System eins in Release-Konfiguration. Es bleibt jedoch die Frage, warum Vergleiche Zeit brauchen, aber keine Sprünge? – greenpiece

+0

Sie schreiben einen Heap-Manager, um ihn zu testen, müssen Sie ihn stark laden. Du schaust eindeutig auf die innere Schleife. Wenn Sie möchten, dass es schnell ist, verwenden Sie die gesamte verstrichene Zeit, um die Beschleunigung zu messen. Wie viel Prozent ist es, Ihnen zu sagen, wo Sie nach Beschleunigungen suchen. Wenn Sie den Prozentsatz in einem Codeabschnitt nach unten drücken, erhöhen Sie ihn in einem anderen Code, da er immer noch zu 100% addiert werden muss. Es könnte also eine Frage von Cache-Misses und Verzweigungsvorhersage sein. Das sind die CPU-Ingenieure, die versuchen, Ihnen Zeit zu sparen. Aber du kannst dir das ansehen und sagen "Kann ich das weniger machen?" So sparen Sie Zeit. –

Antwort

1

Intel und AMD CPUs macro-fuse cmp/jcc pairs into a single compare-and-branch UOP (Intel) oder Makro-Op (AMD). Intel-CPUs der SnB-Familie wie Ihres können dies mit einigen Anweisungen, die auch ein Ausgangsregister schreiben, wie and, sub/add, inc/dec.

Um die Profilerstellung wirklich zu verstehen, müssen Sie etwas darüber verstehen, wie die Out-of-Order-Pipeline in der Mikroarchitektur funktioniert, auf die Sie abstimmen. Siehe die Links unter der Tag-Wiki, insbesondere Agner Fog's microarch pdf.

Sie sollten auch darauf achten, dass die Anzahl der Profiling-Zyklen der Anweisung, die auf Ergebnisse wartet, in Rechnung gestellt wird, nicht die Anweisung, die sie langsam erzeugt.