Saya perlu menemukan hambatan dan perlu seakurat mungkin mengukur waktu.
Apakah potongan kode berikut ini cara terbaik untuk mengukur kinerja?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
Jawaban:
Tidak, tidak. Gunakan Stopwatch (dalam
System.Diagnostics
)Stopwatch secara otomatis memeriksa keberadaan timer presisi tinggi.
Perlu disebutkan bahwa
DateTime.Now
seringkali sedikit lebih lambat daripadaDateTime.UtcNow
karena pekerjaan yang harus dilakukan dengan zona waktu, DST dan semacamnya.DateTime.UtcNow biasanya memiliki resolusi 15 ms. Lihat posting blog John Chapman tentang
DateTime.Now
presisi untuk ringkasan yang bagus.Hal-hal sepele yang menarik: Stopwatch kembali hidup
DateTime.UtcNow
jika perangkat keras Anda tidak mendukung penghitung frekuensi tinggi. Anda dapat memeriksa untuk melihat apakah Stopwatch menggunakan perangkat keras untuk mencapai presisi tinggi dengan melihat Stopwatch bidang statis .sumber
PerformWork()
sangat kekurangan, Anda mungkin dapat memanggilnya berulang kali dan menghitung rata-rata kumpulan panggilan. Selain itu, atur seluruh batch panggilan daripada memulai / menghentikan AndaStopwatch
untuk menghindari efek strobo yang akan memperkeruh pengukuran waktu Anda.Jika Anda menginginkan sesuatu yang cepat dan kotor saya sarankan menggunakan Stopwatch sebagai gantinya untuk tingkat presisi yang lebih tinggi.
Atau, jika Anda membutuhkan sesuatu yang sedikit lebih canggih Anda mungkin harus mempertimbangkan untuk menggunakan profiler pihak ke-3 seperti SEMUT .
sumber
Artikel ini mengatakan bahwa pertama-tama Anda perlu membandingkan tiga alternatif
Stopwatch
,,DateTime.Now
DANDateTime.UtcNow
.Ini juga menunjukkan bahwa dalam beberapa kasus (ketika penghitung kinerja tidak ada) Stopwatch menggunakan DateTime.UtcNow + beberapa pemrosesan tambahan. Karena itu jelas bahwa dalam hal ini DateTime.UtcNow adalah pilihan terbaik (karena yang lain menggunakannya + beberapa pemrosesan)
Namun, ternyata, penghitung hampir selalu ada - lihat Penjelasan tentang penghitung kinerja resolusi tinggi dan keberadaannya terkait dengan .NET Stopwatch? .
Ini adalah grafik kinerja. Perhatikan bagaimana UtcNow berbiaya rendah dibandingkan dengan alternatif:
Sumbu X adalah ukuran data sampel, dan sumbu Y adalah waktu relatif dari contoh.
Satu hal
Stopwatch
yang lebih baik adalah memberikan pengukuran waktu resolusi yang lebih tinggi. Lain adalah sifatnya yang lebih OO. Namun, membuat pembungkus OOUtcNow
tidak sulit.sumber
Sangat berguna untuk mendorong kode pembandingan Anda ke kelas / metode utilitas. The
StopWatch
kelas tidak perluDisposed
atauStopped
pada kesalahan. Jadi, kode paling sederhana untuk menentukan waktu beberapa tindakan adalahContoh kode panggilan
Ini adalah versi metode ekstensi
Dan contoh kode panggilan
sumber
Elapsed.TotalMilliseconds
untuk presisi yang lebih tinggi. Lihat pertanyaan ini juga stackoverflow.com/questions/8894425/…The stopwatch fungsi akan lebih baik (presisi tinggi). Saya juga merekomendasikan hanya mengunduh salah satu profiler populer, ( DotTrace dan ANTS adalah yang paling sering saya gunakan ... percobaan gratis untuk DotTrace berfungsi penuh dan tidak mengomel seperti yang lain).
sumber
Gunakan kelas System.Diagnostics.Stopwatch.
sumber
Ditto Stopwatch, ini jauh lebih baik.
Mengenai pengukuran kinerja, Anda juga harus memeriksa apakah "// Beberapa Proses Eksekusi" Anda adalah proses yang sangat singkat.
Ingat juga bahwa proses pertama "// Some Execution Process" Anda mungkin lebih lambat daripada proses selanjutnya.
Saya biasanya menguji metode dengan menjalankannya 1000 kali atau 1000000 kali dalam satu lingkaran dan saya mendapatkan data yang jauh lebih akurat daripada menjalankannya sekali.
sumber
Ini semua adalah cara yang bagus untuk mengukur waktu, tetapi itu hanya cara yang sangat tidak langsung untuk menemukan hambatan.
Cara paling langsung untuk menemukan bottneck di utas adalah menjalankannya, dan saat melakukan apa pun yang membuat Anda menunggu, hentikan dengan jeda atau kunci istirahat. Lakukan ini beberapa kali. Jika kemacetan Anda memakan waktu X%, X% adalah probabilitas bahwa Anda akan menangkapnya dalam aksi di setiap snapshot.
Berikut adalah penjelasan yang lebih lengkap tentang bagaimana dan mengapa itu bekerja
sumber
@ Sean Chambers
FYI, kelas .NET Timer bukan untuk diagnostik, ini menghasilkan peristiwa pada interval yang telah ditentukan, seperti ini (dari MSDN ):
Jadi ini benar-benar tidak membantu Anda tahu berapa lama sesuatu, hanya saja sejumlah waktu telah berlalu.
Timer juga ditampilkan sebagai kontrol di System.Windows.Forms ... Anda dapat menemukannya di kotak alat desainer Anda di VS05 / VS08
sumber
Ini cara yang benar:
Untuk informasi lebih lanjut, gunakan Use Stopwatch alih-alih DataTime untuk mendapatkan penghitung kinerja yang akurat .
sumber
Sistem Tim Visual Studio memiliki beberapa fitur yang dapat membantu mengatasi masalah ini. Pada dasarnya Anda dapat menulis unit test dan mencampurnya dalam skenario yang berbeda untuk dijalankan terhadap perangkat lunak Anda sebagai bagian dari stress atau load test. Ini dapat membantu mengidentifikasi area kode yang paling memengaruhi kinerja aplikasi Anda.
Grup Pola dan Praktik Microsoft memiliki beberapa panduan dalam Pedoman Pengujian Kinerja Sistem Tim Visual Studio .
sumber
Saya baru saja menemukan posting di blog Vance Morrison tentang kelas CodeTimer yang ditulisnya yang membuat penggunaan
StopWatch
lebih mudah dan melakukan beberapa hal yang rapi di samping.sumber
Ini tidak cukup profesional:
Versi yang lebih andal adalah:
Dalam kode saya yang sebenarnya, saya akan menambahkan panggilan GC.Collect untuk mengubah tumpukan terkelola ke status yang diketahui, dan menambahkan panggilan Tidur sehingga interval kode yang berbeda dapat dengan mudah dipisahkan dalam profil ETW.
sumber
Saya telah melakukan sangat sedikit pemeriksaan kinerja semacam ini (saya cenderung hanya berpikir "ini lambat, buatlah lebih cepat") jadi saya sudah hampir selalu melakukannya.
Google tidak mengungkapkan banyak sumber daya / artikel untuk memeriksa kinerja.
Banyak yang menyebutkan menggunakan pinvoke untuk mendapatkan informasi kinerja. Banyak materi yang saya pelajari hanya benar-benar menyebutkan menggunakan perfmon ..
Edit:
Terlihat pembicaraan StopWatch .. Bagus! Saya telah belajar sesuatu :)
Ini terlihat seperti artikel yang bagus
sumber
Cara saya menggunakan dalam program saya menggunakan kelas StopWatch seperti yang ditunjukkan di sini.
sumber