Saya menulis kode seperti ini, melakukan pengaturan waktu yang sedikit cepat dan kotor:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Tentunya ada cara untuk menyebut sedikit kode waktu ini sebagai lambda .NET 3.0 yang mewah daripada (Tuhan melarang) memotong dan menempelkannya beberapa kali dan menggantinya DoStuff(s)
dengan DoSomethingElse(s)
?
Saya tahu itu bisa dilakukan sebagai Delegate
tapi saya bertanya-tanya tentang cara lambda.
Time
berperilaku sebagai metode statis, membuang semua status yang ada disw
, jadi memperkenalkannya sebagai metode instance hanya terlihat menarik perhatian.Stopwatch.StartNew
, yang statis karena suatu alasan. C # tidak memiliki kemampuan untuk menambahkan metode statis ke kelas yang ada (tidak seperti F #), jadi saya memahami dorongan untuk melakukan ini, tetapi masih meninggalkan rasa tidak enak di mulut saya.Inilah yang telah saya gunakan:
Pemakaian:
sumber
Console.WriteLine("")
untuk pengujian di bawah// do stuff that I want to measure
, maka kompiler tidak senang sama sekali. Apakah Anda seharusnya melakukan ekspresi dan pernyataan normal di sana?Anda dapat mencoba menulis metode ekstensi untuk kelas apa pun yang Anda gunakan (atau kelas dasar apa pun).
Saya ingin panggilan tersebut terlihat seperti:
Kemudian metode ekstensi:
Objek apa pun yang diturunkan dari DependencyObject sekarang bisa memanggil TimedFor (..). Fungsi ini dapat dengan mudah disesuaikan untuk memberikan nilai kembali melalui parameter ref.
-
Jika Anda tidak ingin fungsionalitasnya terikat ke kelas / objek apa pun, Anda dapat melakukan sesuatu seperti:
Kemudian Anda bisa menggunakannya seperti:
Jika gagal, jawaban ini sepertinya memiliki kemampuan "umum" yang layak:
Membungkus waktu StopWatch dengan delegasi atau lambda?
sumber
The
StopWatch
kelas tidak perluDisposed
atauStopped
pada kesalahan. Jadi, kode paling sederhana untuk mengatur waktu beberapa tindakan adalahContoh kode panggilan
Saya tidak suka ide memasukkan iterasi ke dalam
StopWatch
kode. Anda selalu dapat membuat metode atau ekstensi lain yang menanganiN
pengulangan eksekusi .Contoh kode panggilan
Berikut adalah versi metode ekstensi
Dan contoh kode panggilan
Saya menguji metode statis dan metode ekstensi (menggabungkan iterasi dan benchmark) dan delta waktu eksekusi yang diharapkan dan waktu eksekusi nyata adalah <= 1 ms.
sumber
Saya menulis kelas CodeProfiler sederhana beberapa waktu lalu yang membungkus Stopwatch untuk dengan mudah membuat profil metode menggunakan Action: http://www.improve.dk/blog/2008/04/16/profiling-code-the-easy-way
Ini juga akan dengan mudah memungkinkan Anda untuk membuat profil kode multithread. Contoh berikut akan membuat profil lambda tindakan dengan 1-16 utas:
sumber
Dengan asumsi Anda hanya perlu waktu cepat untuk satu hal, ini mudah digunakan.
sumber
Anda dapat membebani sejumlah metode untuk mencakup berbagai kasus parameter yang mungkin ingin Anda teruskan ke lambda:
Alternatifnya, Anda dapat menggunakan delegasi Func jika mereka harus mengembalikan nilai. Anda juga dapat mengirimkan array (atau lebih) parameter jika setiap iterasi harus menggunakan nilai yang unik.
sumber
Bagi saya ekstensi terasa sedikit lebih intuitif di int, Anda tidak perlu lagi membuat Stopwatch atau khawatir tentang mengatur ulang.
Jadi kamu punya:
Dengan contoh penggunaan:
Output sampel:
sumber
Saya suka menggunakan kelas CodeTimer dari Vance Morrison (salah satu dudes kinerja dari .NET).
Dia membuat postingan di blognya yang berjudul " Mengukur kode yang dikelola dengan cepat dan mudah: CodeTimers ".
Ini mencakup hal-hal keren seperti MultiSampleCodeTimer. Itu melakukan perhitungan otomatis dari mean dan deviasi standar dan juga sangat mudah untuk mencetak hasil Anda.
sumber
sumber