Yöntem sonunda Kronometreyi Durdurmalı mıyım?


89

Diyelim ki basit ölçümlerimiz var. 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'ye göre:

Tipik bir Kronometre senaryosunda, Başlangıç ​​yöntemini çağırırsınız, ardından Durdur yöntemini çağırırsınız ve ardından Geçen süreyi kullanarak geçen süreyi kontrol edersiniz.

Artık zamanlayıcı örneğiyle ilgilenmediğimde bu yöntemi çağırmam gerekip gerekmediğinden emin değilim. StopYöntemi kullanarak "temizlemeliyim" ?

DÜZENLE

Logger.Log (..) ' timer.Elapsedun , logger günlüklerinden önce okunduğu için hiçbir maliyeti olmadığını unutmayın .


1
StopDikkatsiz hatalardan yöntem önler sizi, örneğin sen değerlendirerek eğer Elapsedmülkiyet birden çok kez.
Tim Schmelter


Zamanlayıcı kapsam dışına çıktığına göre, aramanın Stopherhangi bir fark yaratacağına neden inanıyorsunuz ? Değeri yine de kullanamazsınız
Varsayılan

Yanıtlar:


81

Hayır, durdurmana gerek yok. Stop()sadece geçen zamanı izlemeyi durdurur. Herhangi bir kaynağı serbest bırakmaz.


4
Ancak dikkatsiz hataları önlemek için yine de kullanmak iyi bir uygulamadır.
Tim Schmelter

12
Hiçbir şeyi engellemez, yöntemde kronometreyi yaratıyor ve geri vermiyor, bu yüzden daha sonra "hata yapmak" için onu ele geçiremeyecek.
Ronan Thibaudau

21
Ayrıca bir Kronometre Başlat () ve Durdur () çağrıları arasında herhangi bir iş yapmıyor veya cpu saat döngülerini yemiyor. Start (), yalnızca bir zaman damgasını şimdiye ayarlar ve Stop (), bundan sonra geçen zamanı hesaplar ve kaydeder. Coreclr'daki kaynağa bakın: github.com/dotnet/corefx/blob/master/src/…
Sammi

42

Hayır, onu durdurmaya veya temizlemeye gerek yok.

Stopwatchyönetilmeyen kaynakları kullanmaz (eğer düşündüyseniz IDisposable). Aslında hiçbir kaynağı kullanmaz (tabii ki nesnenin kendisi tarafından kullanılan bellek hariç)! Ayrıca geçen süreyi ölçerken herhangi bir CPU tüketmez!

NET (tam .NET Framework, Mono, .NET Çekirdek) pencereleri uygulamalarda, sadece çağrıları QueryPerformanceCounter()gerektiğinde, Windows API (açık Start()ve Stop()ve okurken Elapsed) yüksek çözünürlüklü zaman damgası almak için.

Mono ve clock_gettime.

Uygulama ayrıntıları hakkında gerçek bir merakı olan herkese: bu yazıyı okuyun .


5

Geçen değeri yeniden kullanmak istiyorsanız Durdurun yararlı olduğunu düşünüyorum.


Ama
Dariusz

O zaman harika :), "only" kullanmalıydım. Sınıf Dispose arayüzünü uygulamıyor, bu yüzden hiçbir temizleme tetiklenmemeli.
vvv

2
@vvv Eğer isterseniz bunu cevabınıza ekleyebilirsiniz - cevap ile yorumlar arasında "düzenle" yazan bir düğme vardır.
Varsayılan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.