2010-05-10 13 views
64

Ich brauche einen genauen Timer, und DateTime.Now scheint nicht genau genug. Aus den Beschreibungen, die ich gelesen habe, scheint System.Diagnostics.Stopwatch genau das zu sein, was ich will.Kann die Stoppuhr im Produktionscode verwendet werden?

Aber ich habe eine Phobie. Ich bin nervös, irgendetwas von System.Diagnostics im tatsächlichen Produktionscode zu verwenden. (Ich benutze es ausgiebig zum Debuggen mit Asserts und PrintLns usw., aber noch nie für Produktionsmaterial.) Ich versuche nicht nur einen Timer zu verwenden, um meine Funktionen zu benchmarken - meine App benötigt einen echten Timer. Ich habe auf einem anderen Forum gelesen, dass System.Diagnostics.StopWatch nur für das Benchmarking ist und nicht im Handelscode verwendet werden sollte, obwohl kein Grund angegeben wurde. Ist das korrekt, oder bin ich (und wer auch immer diesen Ratschlag gepostet hat) zu sehr geschlossen wegen System.Diagnostics? dh, ist es in Ordnung, System.Diagnostics.Stopwatch im Produktionscode zu verwenden? Danke Adrian

+0

Welche Art von Timer benötigen Sie? Möchten Sie, dass eine Methode nach einiger Zeit aufgerufen wird, oder müssen Sie wissen, wie viel Zeit bis jetzt verstrichen ist? Welche Präzision brauchen Sie? – mnemosyn

+1

mögliche Duplikate von [Wie bekomme ich eine Echtzeituhr in C#?] (Http://stackoverflow.com/questions/2800559/how-to-get-a-real-time-clock-in-c). Ich sehe nicht, wie sich das von der anderen Frage unterscheidet. Vielleicht, wenn Sie es zu ändern, "gibt es ein Problem mit System.Diagnostics-Klassen in der Produktion, aber jetzt ist es ein Duplikat". –

+1

@John - IMO, definitiv kein Duplikat. Die andere Frage fragt, wie es geht; Diese Frage fragt, ob es in Ordnung ist, es zu tun. Das andere OP könnte einen seltsamen Grund haben, die Stoppuhr zu meiden (zB verrückte Unternehmens-BS-Regeln, die keinen Sinn ergeben, aber dennoch beachtet werden müssen. Nein, ich bin nicht bitter!) – dss539

Antwort

51

Unter der Haube ist so ziemlich alles Stoppuhr wickeln QueryPerformanceCounter. Wie ich es verstehe, ist Stoppuhr da, um den Zugriff auf den hochauflösenden Timer zu ermöglichen - wenn Sie diese Auflösung im Produktionscode brauchen, sehe ich nichts falsch daran, sie zu benutzen.

+2

Wir Verwenden Sie QueryPerformanceCounter die ganze Zeit im Produktionscode. Es ist vollkommen vernünftig, diese Infrastruktur in prod zu verwenden. –

4

Afaik StopWatch ist eine Shell über QueryPerformanceCounter Funktionalität. Diese Funktion ist die Grundlage für eine Vielzahl von Leistungsindikatoren. QPF ist sehr schnell anzurufen und absolut sicher. Wenn Sie sich im Namespace Diagnostics paranoid fühlen, rufen Sie den QPF direkt auf.

+7

Durch Erweiterung, wenn Sie sich paranoid über 'int fühlen, schreiben Sie Ihr eigenes ... – Gusdor

3

Die Stoppuhr ist basically a neat wrapper um die nativen Methoden QueryPerformanceCounter und . Wenn Sie sich nicht wohl fühlen mit dem System.Diagnostic Namensraum, können Sie access these directly.

Die Verwendung des Leistungsindikators ist sehr üblich, da ist nichts falsch daran. AFAIK, es ist keine höhere Timer-Präzision verfügbar. Beachten Sie, dass die QPF möglicherweise zu Problemen mit Multiprozessor Computern führt, aber der zuvor verknüpfte MSDN-Artikel enthält einige zusätzliche Informationen dazu. Es ist ratsam, dafür zu sorgen, System.Diagnostics.Stopwatch das im Hintergrund zu tun oder die SetThreadAffinity manuell aufzurufen - sonst könnte Ihr Timer zurückspringen in der Zeit!

Beachten Sie, dass für sehr hohe Präzisionsmessungen some subtleties berücksichtigt werden müssen. Wenn Sie so viel Präzision benötigen, könnten diese einige Bedenken haben.

5

Sie sagen, Sie auf einem anderen Forum gelesen habe keine Klassen zu verwenden, um von System.Diagnostics in der Produktion. Aber die einzige Quelle, über die Sie sich Gedanken machen sollten, ist Microsoft, der den Code erstellt hat. Sie sagen, dass die StopWatch class:

bietet eine Reihe von Methoden und Eigenschaften, die Sie verwenden können, um die verstrichene Zeit genau zu messen.

Sie sagen nicht, "außer in der Produktion".

+5

Ich denke, die Implikation war, dass es teuer sein könnte ... – Tim

0

Je nachdem, für was Sie den Timer verwenden, müssen Sie möglicherweise andere Probleme berücksichtigen. Windows bietet keine Garantie für das Timing der Ausführung. Sie sollten sich daher nicht auf Echtzeitverarbeitung verlassen (es gibt Echtzeiterweiterungen für Windows, die eine harte Echtzeitplanung ermöglichen).Ich vermute auch, dass Sie aufgrund von Kontextwechsel die Präzision verlieren könnten, nachdem Sie das Zeitintervall erfasst haben und bevor Sie etwas damit machen, das von seiner Genauigkeit abhängt. Im Prinzip könnte dies ein beliebig langer Zeitraum sein; In der Praxis sollte es in der Größenordnung von Millisekunden liegen. Es hängt wirklich davon ab, wie wichtig dieses Timing ist.

21

Ja, System.Diagnostics klingt wie es ist nur zum Debuggen, aber lassen Sie sich nicht den Namen täuschen. Der Namespace System.Diagnostics mag am Anfang etwas erschreckend klingen, um ihn im Produktionscode zu verwenden (für mich), aber es gibt viele nützliche Dinge in diesem Namespace.

Einige Dinge, wie die Process Klasse, sind nützlich für die Interaktion mit dem System. Mit Process.Start können Sie andere Anwendungen starten, eine Website für den Benutzer starten, eine Datei oder einen Ordner usw. öffnen.

Andere Dinge, wie die Trace Klasse, können Ihnen helfen, Fehler im Produktionscode aufzuspüren. Zugegeben, Sie werden sie nicht immer im Produktionscode verwenden, aber sie sind sehr nützlich zum Protokollieren und Aufspüren dieser schwer fassbaren Fehler auf einem Remote-Computer.

Mach dir keine Sorgen über den Namen.

Verwandte Themen