Haruskah saya Menghentikan Stopwatch di akhir metode?

89

Mari kita bayangkan kita memiliki pengukuran sederhana menggunakan 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?
}

Menurut MSDN:

Dalam skenario Stopwatch biasa, Anda memanggil metode Mulai, kemudian memanggil metode Berhenti , kemudian Anda memeriksa waktu yang berlalu menggunakan properti Berlalu.

Saya tidak yakin apakah saya harus memanggil metode ini ketika saya tidak lagi tertarik dengan contoh pengatur waktu. Haruskah saya "menjernihkan" menggunakan Stopmetode?

EDIT

Perlu diingat bahwa Logger.Log (..) tidak ada biaya karena timer.Elapseddibaca sebelum logger.

Dariusz
sumber
1
The StopMetode mencegah Anda dari kesalahan ceroboh, misalnya jika Anda mengevaluasi Elapsedproperti beberapa kali.
Tim Schmelter
3
Lihatlah sumbernya: referenceource.microsoft.com/#System/services/monitoring/…
Kris Vandermotten
Karena pengatur waktu keluar dari ruang lingkup, mengapa Anda percaya bahwa panggilan Stopakan membuat perbedaan? Anda tetap tidak dapat menggunakan nilainya
Default

Jawaban:

81

Tidak, Anda tidak perlu menghentikannya. Stop()berhenti melacak waktu yang telah berlalu. Itu tidak membebaskan sumber daya apa pun.

Uriil
sumber
4
Tetapi praktik yang baik untuk tetap menggunakannya untuk mencegah kesalahan yang ceroboh.
Tim Schmelter
12
Itu tidak mencegah apa pun, dia membuat stopwatch dengan metode dan tidak mengembalikannya, jadi dia tidak akan bisa mendapatkannya nanti untuk "membuat kesalahan dengan".
Ronan Thibaudau
21
Juga Stopwatch tidak melakukan pekerjaan apa pun atau memakan siklus jam cpu antara panggilan ke Start () dan Stop (). Start () hanya menyetel stempel waktu ke sekarang dan Stop () menghitung dan menyimpan waktu yang telah berlalu sejak itu. Lihat sumber di coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi
42

Tidak, tidak perlu menghentikan atau membersihkannya.

Stopwatchtidak menggunakan sumber daya yang tidak dikelola (jika Anda memikirkannya IDisposable). Ini sebenarnya tidak menggunakan setiap sumber daya sama sekali (kecuali memori yang digunakan oleh objek itu sendiri, tentu saja)! Itu juga tidak mengkonsumsi CPU apa pun saat mengukur waktu yang telah berlalu!

Dalam jendela implementasi dari NET (.NET Framework penuh, Mono, NET Core), itu hanya panggilan QueryPerformanceCounter()API Windows ketika dibutuhkan (pada Start()dan Stop()dan ketika membaca Elapsed) untuk mengambil resolusi tinggi cap waktu.

Dalam implementasi Linux dari Mono dan .NET Core, ia menggunakan clock_gettimefungsi untuk mengambil nilai waktu yang meningkat secara monotonik.

Untuk siapa saja yang sangat ingin tahu tentang detail implementasi: baca posting ini .

Mohammad Dehghan
sumber
5

Saya pikir Stop berguna jika Anda ingin menggunakan kembali nilai Elapsed.

vvv
sumber
Tapi saya tidak perlu dalam contoh saya :)
Dariusz
Maka itu hebat :), saya seharusnya menggunakan "hanya" Kelas tidak mengimplementasikan antarmuka Buang, jadi tidak ada pembersihan yang harus dipicu.
vvv
2
@vvv Jika mau, Anda dapat menambahkannya ke jawaban Anda - ada tombol di antara jawaban dan komentar yang bertuliskan "edit".
Default
0

Jika kode Anda tidak perlu dihitung, maka tidak perlu menggunakan Stop ().

funbrain9
sumber