Frage

Ich bin auf der Suche in die genauen Auswirkungen von Queryperformancecounter in unserem System und ich versuche es die Auswirkungen auf die Anwendung zu verstehen. Ich kann vom Laufen auf meiner 4-Core-Single-CPU-Maschine sehen, dass es 230ns dauert rund zu laufen. Wenn ich es auf einem 24-Core-4-CPU Xeon laufen dauert es 1,4 ms herum zu laufen. Interessanter auf meiner Maschine mehr, wenn es in mehreren Threads laufen sie einander nicht beeinflussen. Aber auf der Multi-CPU-Maschine bewirken, dass die Fäden eine Art der Interaktion, die sie sich gegenseitig blockieren, bewirkt. Ich frage mich, ob es ein Shared-Resource auf dem Bus ist, dass sie alle Abfrage? Was genau passiert, wenn ich Queryperformancecounter nennen und was misst es wirklich?

War es hilfreich?

Lösung

Windows-Queryperformancecounter () hat Logik die Anzahl der Prozessoren und invoke syncronization Logik, falls erforderlich, um zu bestimmen. Es versucht, das TSC-Register zu verwenden, sondern auch für Multi-Prozessor-Systeme dieses Register nicht gewährleistet ist zwischen den Prozessoren (stark durch intelligentes downclocking und Schlafzustände und was noch wichtiger ist unterschiedlich sein kann) synchronisiert werden.

MSDN sagt, dass es keine Rolle, welcher Prozessor diese aufgerufen wird, so dass Sie eine solche Situation Ursache Aufwand für zusätzliche syncronization Code sehen werden kann. Denken Sie auch daran, dass es einen Bustransfer aufrufen kann, so dass Sie sein können Buskonkurrenzsituation Verzögerungen zu sehen.

Versuchen SetThreadAffinityMask () verwenden, wenn möglich, sie an einen bestimmten Prozessor zu binden. Ansonsten können Sie nur mit der Verzögerung zu leben haben, oder Sie können einen anderen Timer versuchen (zum Beispiel einen Blick auf http :. //en.wikipedia.org/wiki/High_Precision_Event_Timer )

Andere Tipps

Ich weiß, dass dieser Thread ist ein bisschen alt, aber ich möchte weitere Informationen hinzuzufügen. Erstens, ich stimme zu, dass Queryperformancecounter mehr Zeit auf bestimmte Maschinen nehmen, aber ich bin nicht sicher, ob Rons Antwort ist der Grund für das die ganze Zeit. Während ich in dieser Frage etwas Forschung tat, fand ich verschiedene Web-Seiten, die Gespräche darüber, wie Queryperformancecounter umgesetzt wird. Zum Beispiel Präzision ist nicht die gleiche wie Genauigkeit sagt mir, dass Windows HAL spezifischere den Wert zu erhalten, würde verwenden unterschiedliches Timing-Gerät zu sein. Dies bedeutet, dass, wenn Fenster langsames Zeitmessgerät verwenden bekommen wie PIT, wird es mehr Zeit in Anspruch nehmen, den Zeitwert zu erhalten. Offensichtlich PIT mit möglicherweise PCI-Transaktion erfordern, so dass ein Grund sein würde.

Ich fand auch einen anderen Artikel: So funktioniert es: Timer-Ausgänge in SQL Server 2008 R2 - unveränderliche TSC, die ähnliche Beschreibung. In der Tat, sagt dieser Artikel, wie SQLServer die Transaktion in der besten Weise Zeit würde.

Dann fand ich weitere Informationen über VMware-Website, weil ich mit den Kunden zu tun hatte, die VMs verwenden, und ich fand, dass es andere Probleme mit Zeitmessung mit VMs. Für diejenigen, die interessiert sind, finden Sie in VMware Papier - Zeitnehmung in VMware Virtual Machines In diesem Papier spricht auch darüber, wie einige Versionen von Windows jeweils TSCs synchronisieren würden. Somit wäre es sicher Queryperformancecounter () in bestimmten Situationen zu verwenden, und ich denke, dass wir so etwas wie versuchen sollten, was wie es funktioniert: Timer-Ausgänge in SQL Server 2008 R2, was zu finden vorgeschlagen könnte passieren, wenn wir nennen Queryperformancecounter ()

Ich habe den Eindruck, dass auf x86 Queryperformancecounter () nur RDTSC unter der Decke genannt. Ich bin überrascht, dass es jede Verlangsamung auf Multi-Core-Maschinen hat (ich habe nie bemerkt, es auf meinem 4-Core-CPU).

Es ist schon eine lange Zeit, da ich so viel verwendet, aber wenn der Speicher dient es nicht eine Implementierung dieser Funktion, da die Innereien von den verschiedenen Hardware-Herstellern zur Verfügung gestellt werden.

Hier ist ein kleiner Artikel von MSDN: http://msdn.microsoft.com/ja-jp/library/cc399059. aspx

Auch wenn Sie die Leistung über mehrere CPUs sind Abfragen (wie auf einer CPU mit mehreren Kernen gegen), es ist zu haben, über den Bus zu kommunizieren, die beide langsamer ist und sein könnte, wo man einige Blockierung sehen.

Doch wie ich schon sagte, bevor es schon eine ganze Weile.

Mike

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top