BenchmarkDotNet membantu Anda mengubah metode menjadi tolok ukur, melacak kinerja mereka, dan berbagi eksperimen pengukuran yang dapat direproduksi. Tidak lebih sulit dari menulis tes unit! Di bawah kap, ia melakukan banyak sihir yang menjamin hasil yang andal dan tepat berkat mesin statistik perfolizer. BenchmarkDotnet melindungi Anda dari kesalahan benchmarking populer dan memperingatkan Anda jika ada sesuatu yang salah dengan desain benchmark Anda atau pengukuran yang diperoleh. Hasilnya disajikan dalam bentuk ramah pengguna yang menyoroti semua fakta penting tentang percobaan Anda. BenchmarkDotnet sudah diadopsi oleh 22000+ proyek GitHub termasuk .NET Runtime, .NET Compiler, .NET Performance, dan banyak lainnya.
Sangat mudah untuk mulai menulis tolok ukur, lihat contoh berikut (versi copy-pastable ada di sini):
[ SimpleJob ( RuntimeMoniker . Net472 , baseline : true ) ]
[ SimpleJob ( RuntimeMoniker . NetCoreApp30 ) ]
[ SimpleJob ( RuntimeMoniker . NativeAot70 ) ]
[ SimpleJob ( RuntimeMoniker . Mono ) ]
[ RPlotExporter ]
public class Md5VsSha256
{
private SHA256 sha256 = SHA256 . Create ( ) ;
private MD5 md5 = MD5 . Create ( ) ;
private byte [ ] data ;
[ Params ( 1000 , 10000 ) ]
public int N ;
[ GlobalSetup ]
public void Setup ( )
{
data = new byte [ N ] ;
new Random ( 42 ) . NextBytes ( data ) ;
}
[ Benchmark ]
public byte [ ] Sha256 ( ) => sha256 . ComputeHash ( data ) ;
[ Benchmark ]
public byte [ ] Md5 ( ) => md5 . ComputeHash ( data ) ;
}BenchmarkDotnet secara otomatis menjalankan tolok ukur pada semua runtime, mengumpulkan pengukuran, dan mencetak tabel ringkasan dengan informasi paling penting:
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[ Host ] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
NativeAot70 : .NET 7.0.0-preview.4.22172.7, X64 NativeAOT
Mono : Mono 6.4.0 (Visual Studio), X64
| Method | Runtime | N | Mean | Error | StdDev | Ratio |
| ------- | -------------- | ------ | -----------: | ----------: | ----------: | ------: |
| Sha256 | .NET 4.7.2 | 1000 | 7.735 us | 0.1913 us | 0.4034 us | 1.00 |
| Sha256 | .NET Core 3.0 | 1000 | 3.989 us | 0.0796 us | 0.0745 us | 0.50 |
| Sha256 | NativeAOT 7.0 | 1000 | 4.091 us | 0.0811 us | 0.1562 us | 0.53 |
| Sha256 | Mono | 1000 | 13.117 us | 0.2485 us | 0.5019 us | 1.70 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 1000 | 2.872 us | 0.0552 us | 0.0737 us | 1.00 |
| Md5 | .NET Core 3.0 | 1000 | 1.848 us | 0.0348 us | 0.0326 us | 0.64 |
| Md5 | NativeAOT 7.0 | 1000 | 1.817 us | 0.0359 us | 0.0427 us | 0.63 |
| Md5 | Mono | 1000 | 3.574 us | 0.0678 us | 0.0753 us | 1.24 |
| | | | | | | |
| Sha256 | .NET 4.7.2 | 10000 | 74.509 us | 1.5787 us | 4.6052 us | 1.00 |
| Sha256 | .NET Core 3.0 | 10000 | 36.049 us | 0.7151 us | 1.0025 us | 0.49 |
| Sha256 | NativeAOT 7.0 | 10000 | 36.253 us | 0.7076 us | 0.7571 us | 0.49 |
| Sha256 | Mono | 10000 | 116.350 us | 2.2555 us | 3.0110 us | 1.58 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 10000 | 17.308 us | 0.3361 us | 0.4250 us | 1.00 |
| Md5 | .NET Core 3.0 | 10000 | 15.726 us | 0.2064 us | 0.1930 us | 0.90 |
| Md5 | NativeAOT 7.0 | 10000 | 15.627 us | 0.2631 us | 0.2461 us | 0.89 |
| Md5 | Mono | 10000 | 30.205 us | 0.5868 us | 0.6522 us | 1.74 |
Data yang diukur dapat diekspor ke berbagai format (MD, HTML, CSV, XML, JSON, dll.) Termasuk plot:
Mendukung RunTimes: .NET 5+, .NET Framework 4.6.1+, .NET Core 3.1+, Mono, NativeAot
Bahasa yang Didukung: C#, F#, Visual Basic
OS yang didukung: Windows, Linux, MacOS
Arsitektur yang Didukung: x86, x64, ARM, ARM64, WASM dan LOONGARCH64
BenchmarkDotnet memiliki banyak fitur yang penting dalam investigasi kinerja yang komprehensif. Empat aspek mendefinisikan desain fitur -fitur ini: kesederhanaan , otomatisasi , keandalan , dan keramahan .
Anda tidak harus menjadi insinyur kinerja yang berpengalaman jika Anda ingin menulis tolok ukur. Anda dapat merancang eksperimen kinerja yang sangat rumit dalam gaya deklaratif menggunakan API sederhana.
Misalnya, jika Anda ingin parameterisasi tolok ukur Anda, tandai bidang atau properti dengan [Params(1, 2, 3)] : BenchmarkDotnet akan menyebutkan semua nilai yang ditentukan dan menjalankan tolok ukur untuk setiap kasus. Jika Anda ingin membandingkan tolok ukur satu sama lain, tandai salah satu tolok ukur sebagai baseline melalui [Benchmark(Baseline = true)] : BenchmarkDotnet akan membandingkannya dengan semua tolok ukur lainnya. Jika Anda ingin membandingkan kinerja di lingkungan yang berbeda, gunakan pekerjaan. Misalnya, Anda dapat menjalankan semua tolok ukur di .NET Core 3.1 dan Mono melalui [SimpleJob(RuntimeMoniker.NetCoreApp31)] dan [SimpleJob(RuntimeMoniker.Mono)] .
Jika Anda tidak menyukai atribut, Anda dapat menghubungi sebagian besar API melalui gaya fasih dan menulis kode seperti ini:
ManualConfig . CreateEmpty ( ) // A configuration for our benchmarks
. AddJob ( Job . Default // Adding first job
. WithRuntime ( ClrRuntime . Net472 ) // .NET Framework 4.7.2
. WithPlatform ( Platform . X64 ) // Run as x64 application
. WithJit ( Jit . LegacyJit ) // Use LegacyJIT instead of the default RyuJIT
. WithGcServer ( true ) // Use Server GC
) . AddJob ( Job . Default // Adding second job
. AsBaseline ( ) // It will be marked as baseline
. WithEnvironmentVariable ( "Key" , "Value" ) // Setting an environment variable
. WithWarmupCount ( 0 ) // Disable warm-up stage
) ;Jika Anda lebih suka pengalaman baris perintah, Anda dapat mengonfigurasi tolok ukur Anda melalui argumen konsol dalam aplikasi konsol apa pun (jenis aplikasi lain tidak didukung).
Tolok ukur yang andal selalu mencakup banyak kode boilerplate.
Mari kita pikirkan tentang apa yang harus Anda lakukan dalam kasus khas. Pertama, Anda harus melakukan eksperimen percontohan dan menentukan jumlah informasi yang terbaik. Selanjutnya, Anda harus menjalankan beberapa iterasi pemanasan dan memastikan bahwa tolok ukur Anda mencapai kondisi mapan. Setelah itu, Anda harus menjalankan iterasi utama dan menghitung beberapa statistik dasar. Jika Anda menghitung beberapa nilai dalam benchmark Anda, Anda harus menggunakannya entah bagaimana untuk mencegah eliminasi kode mati. Jika Anda menggunakan loop, Anda harus peduli dengan efek loop yang membuka gulungan pada hasil Anda (yang mungkin tergantung pada arsitektur prosesor). Setelah Anda mendapatkan hasil, Anda harus memeriksa beberapa sifat khusus dari distribusi kinerja yang diperoleh seperti multimodality atau outlier yang sangat tinggi. Anda juga harus mengevaluasi overhead infrastruktur Anda dan mengurangi hasil Anda. Jika Anda ingin menguji beberapa lingkungan, Anda harus melakukan pengukuran di masing -masing dan secara manual menggabungkan hasilnya.
Jika Anda menulis kode ini dari awal, mudah untuk melakukan kesalahan dan merusak pengukuran Anda. Perhatikan bahwa ini adalah versi singkat dari daftar periksa lengkap yang harus Anda ikuti selama pembandingan: ada banyak jebakan tersembunyi tambahan yang harus ditangani dengan tepat. Untungnya, Anda tidak perlu mengkhawatirkannya karena BenchmarkDotnet akan melakukan hal-hal yang membosankan dan memakan waktu ini untuk Anda.
Selain itu, perpustakaan dapat membantu Anda dengan beberapa tugas lanjutan yang mungkin ingin Anda lakukan selama penyelidikan. Misalnya, BenchmarkDotNet dapat mengukur lalu lintas memori yang dikelola dan asli dan mencetak daftar pembongkaran untuk tolok ukur Anda.
Banyak tolok ukur tulisan tangan menghasilkan angka yang salah yang mengarah pada keputusan bisnis yang salah. BenchmarkDotnet melindungi Anda dari sebagian besar perangkap benchmarking dan memungkinkan pencapaian presisi pengukuran yang tinggi.
Anda tidak perlu khawatir tentang jumlah doa metode yang sempurna, jumlah pemanasan dan iterasi aktual: BenchmarkDotnet mencoba memilih parameter benchmarking terbaik dan mencapai pertukaran yang baik antara previsi pengukuran dan durasi total semua rangkaian benchmark. Jadi, Anda tidak boleh menggunakan angka ajaib apa pun (seperti "Kami harus melakukan 100 iterasi di sini"), perpustakaan akan melakukannya untuk Anda berdasarkan nilai -nilai metrik statistik.
BenchmarkDotNet juga mencegah pembandingan rakitan yang tidak dioptimalkan yang dibangun menggunakan mode debug karena hasil yang sesuai akan tidak dapat diandalkan. Perpustakaan akan mencetak peringatan jika Anda memiliki debugger terlampir, jika Anda menggunakan hypervisor (hyperv, vmware, virtualbox), atau jika Anda memiliki masalah lain dengan lingkungan saat ini.
Selama 6+ tahun pengembangan, kami menghadapi lusinan masalah berbeda yang dapat merusak pengukuran Anda. Di dalam BenchmarkDotnet, ada banyak heuristik, cek, peretasan, dan trik yang membantu Anda meningkatkan keandalan hasil.
Analisis data kinerja adalah kegiatan yang memakan waktu yang membutuhkan perhatian, pengetahuan, dan pengalaman. BenchmarkDotNet melakukan bagian utama dari analisis ini untuk Anda dan menyajikan hasil dalam bentuk yang ramah pengguna.
Setelah percobaan, Anda mendapatkan tabel ringkasan yang berisi banyak data berguna tentang tolok ukur yang dieksekusi. Secara default, itu hanya mencakup kolom yang paling penting, tetapi mereka dapat dengan mudah disesuaikan. Set kolom adaptif dan tergantung pada definisi benchmark dan nilai yang diukur. Misalnya, jika Anda menandai salah satu tolok ukur sebagai garis dasar, Anda akan mendapatkan kolom tambahan yang akan membantu Anda membandingkan semua tolok ukur dengan garis dasar. Secara default, itu selalu menunjukkan kolom rata -rata, tetapi jika kita mendeteksi perbedaan besar antara rata -rata dan nilai median, kedua kolom akan disajikan.
BenchmarkDotnet mencoba menemukan beberapa sifat yang tidak biasa dari distribusi kinerja Anda dan mencetak pesan bagus tentang hal itu. Misalnya, itu akan memperingatkan Anda jika distribusi multimoda atau outlier tinggi. Dalam hal ini, Anda dapat menggulir hasilnya dan memeriksa histogram gaya ASCII untuk setiap distribusi atau menghasilkan plot PNG yang indah menggunakan [RPlotExporter] .
BenchmarkDotNet tidak membebani Anda dengan data; Ini hanya menunjukkan informasi penting tergantung pada hasil Anda: ini memungkinkan Anda untuk menjaga ringkasan kecil untuk kasus primitif dan memperluasnya hanya untuk kasus yang rumit. Tentu saja, Anda dapat meminta statistik dan visualisasi tambahan secara manual. Jika Anda tidak menyesuaikan tampilan ringkasan, presentasi default akan sebanyak mungkin pengguna. :)
BenchmarkDotnet bukanlah peluru perak yang secara ajaib membuat semua tolok ukur Anda benar dan menganalisis pengukuran untuk Anda. Bahkan jika Anda menggunakan perpustakaan ini, Anda masih harus tahu cara merancang eksperimen benchmark dan bagaimana membuat kesimpulan yang benar berdasarkan data mentah. Jika Anda ingin tahu lebih banyak tentang metodologi benchmarking dan praktik yang baik, disarankan untuk membaca buku karya Andrey Akingshin (Lead Proyek BenchmarkDotnet): "Pro .net Benchmarking". Gunakan panduan mendalam ini untuk merancang tolok ukur dengan benar, mengukur metrik kinerja utama aplikasi .NET, dan menganalisis hasil. Buku ini menyajikan lusinan studi kasus untuk membantu Anda memahami topik pembandingan yang rumit. Anda akan menghindari jebakan umum, mengontrol keakuratan pengukuran Anda, dan meningkatkan kinerja perangkat lunak Anda.
BenchmarkDotNet sudah merupakan perpustakaan fitur lengkap yang stabil yang memungkinkan melakukan penyelidikan kinerja pada tingkat profesional. Dan itu terus berkembang! Kami menambahkan fitur baru sepanjang waktu, tetapi kami memiliki terlalu banyak ide keren baru. Bantuan apa pun akan dihargai. Anda dapat mengembangkan fitur baru, memperbaiki bug, meningkatkan dokumentasi, atau melakukan beberapa hal keren lainnya.
Jika Anda ingin berkontribusi, periksa panduan yang berkontribusi dan masalah-masalah yang lebih besar. Jika Anda memiliki ide baru atau ingin mengeluh tentang bug, jangan ragu untuk membuat masalah baru. Mari kita bangun alat terbaik untuk membandingkan bersama!
Proyek ini telah mengadopsi Kode Etik yang ditentukan oleh Kontributor Perjanjian untuk mengklarifikasi perilaku yang diharapkan di komunitas kami. Untuk informasi lebih lanjut, lihat Kode Etik .NET Foundation.
BenchmarkDotNet didukung oleh AWS Open Source Software Fund.