メソッドの最後でストップウォッチを停止する必要がありますか?


89

を使用して簡単な測定があると想像してみましょう Stopwatch

public void DoWork()
{
    var timer = Stopwatch.StartNew();
    // some hard work
    Logger.Log("Time elapsed: {0}", timer.Elapsed);
    timer.Stop(); // Do I need to call this?
}

MSDNによると:

典型的なストップウォッチのシナリオでは、Startメソッドを呼び出し、最後にStopメソッドを呼び出してから、Elapsedプロパティを使用して経過時間を確認します。

タイマーインスタンスに興味がなくなったときに、このメソッドを呼び出す必要があるかどうかはわかりません。Stopメソッドを使用して「クリーンアップ」する必要がありますか?

編集

Logger.Log(..)timer.Elapsedは、ロガーがログに記録するに読み取られるため、費用がかからないことに注意してください。


1
このStop方法により、たとえばElapsedプロパティを複数回評価する場合など、不注意なミスを防ぐことができます。
ティムシュメルター2014年


タイマーが範囲外になっているのに、なぜ呼び出しStopが何か違いを生むと思いますか?とにかく値を使用することはできません
デフォルト

回答:


81

いいえ、停止する必要はありません。Stop()経過時間の追跡を停止するだけです。リソースを解放することはありません。


4
ただし、不注意なミスを防ぐために、とにかくそれを使用することをお勧めします。
ティムシュメルター2014年

12
それは何も妨げません、彼はメソッドでストップウォッチを作成し、それを返さないので、後で「間違いを犯す」ためにそれを手に入れることはできません。
Ronan Thibaudau 2014年

21
また、ストップウォッチは、Start()とStop()の呼び出しの間に作業を行ったり、CPUクロックサイクルを消費したりしていません。Start()はタイムスタンプをnowに設定するだけで、Stop()はそれ以降の経過時間を計算して保存します。coreclrの
Sammi

42

いいえ、停止したりクリーンアップしたりする必要はありません。

Stopwatch管理されていないリソースを使用しません(考えた場合IDisposable)。実際にはリソースをまったく使用しません(もちろん、オブジェクト自体が使用するメモリを除く)。また、経過時間を測定する際にCPUを消費しません!

.NET(フル.NET Frameworkの、モノ、.NETのコア)のウィンドウの実装では、それだけで呼び出すQueryPerformanceCounter()必要なときに、WindowsのAPI(上Start()Stop()し、読み込むときElapsed)、高解像度のタイムスタンプを取得するために。

LinuxのMonoおよび.NETCoreの実装では、clock_gettime関数を使用して単調に増加する時間値を取得します。

実装の詳細に本当に興味がある人は、この投稿を読んでください。


5

経過値を再利用したい場合は、Stopが便利だと思います。


しかし、私の例では必要ありません:)
Dariusz 2014年

それなら素晴らしいです:)、私は「のみ」を使用する必要がありました。クラスはDisposeインターフェイスを実装していないため、クリーンアップをトリガーする必要はありません。
vvv 2014年

2
@vvv必要に応じて、それを回答に追加できます。回答とコメントの間に「編集」というボタンがあります。
デフォルト

0

コードを計算する必要がない場合は、Stop()を使用する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.