Cara menulis ujian prestasi menggunakan NBench

Semasa bekerja dengan aplikasi, anda sering ingin mengetahui peruntukan memori, overhead pengumpulan sampah (GC), dan throughput kod. Permohonan anda mungkin lambat, atau mungkin memakan banyak sumber, dan anda ingin mengetahui apa yang salah.

Walaupun anda dapat mengesan masalah fungsi dan kecacatan kod menggunakan ujian unit dan tinjauan kod, anda mungkin masih memerlukan kaedah untuk mengasingkan masalah prestasi. Di sinilah NBench sangat berguna. Artikel ini membentangkan perbincangan mengenai NBench dan bagaimana kita dapat menggunakannya untuk menulis ujian prestasi untuk aplikasi .NET.

Apa itu NBench? Mengapa saya mesti menggunakannya?

NBench adalah kerangka pengujian prestasi yang popular yang dapat digunakan untuk profil prestasi kaedah dalam aplikasi kami. NBench dapat mengukur throughput kod aplikasi anda, peruntukan memori, dan overhead GC yang terlibat dalam menuntut kembali memori dengan membersihkan objek yang tidak diingini.

Anda boleh memanfaatkan NBench untuk "menguji unit" prestasi aplikasi anda dengan cara yang sama seperti anda menulis ujian unit menggunakan kerangka XUnit atau NUnit. Perkara yang paling saya sukai mengenai NBench ialah ia dapat disatukan ke saluran paip binaan anda. Walaupun NBench mempunyai pelari sendiri, anda masih boleh menjalankan NBench menggunakan NUnit atau Resharper. Rasanya seperti menjalankan ujian unit anda.

NBench diedarkan sebagai pakej NuGet. Dengan mengandaikan bahawa Visual Studio sudah dipasang pada sistem anda, anda boleh memasang NBench melalui pengurus pakej NuGet atau dengan menggunakan perintah berikut di Konsol pengurus pakej.

Pasang-Pakej NBench

Anda juga harus memasang pakej NBench.Runner, yang digunakan untuk menjalankan penanda aras anda. Anda boleh melakukannya melalui NuGet juga, atau laksanakan perintah berikut dari konsol pengurus pakej.

Pasang-Pakej NBench.Runner

Sekiranya anda seperti saya, anda pasti mahu menjalankan ujian prestasi NBench anda menggunakan NUnit. Anda mungkin ingin menggunakan Pro.NBench.xUnit juga. Pro.NBench.xUnit membolehkan anda menemui, menjalankan, atau men-debug ujian NBench menggunakan xUnit di ReSharper. 

Menulis ujian prestasi menggunakan NBench

Mari terokai bagaimana kita boleh menulis dan melaksanakan ujian prestasi menggunakan NBench. Buat projek perpustakaan kelas baru, dan simpan dengan nama yang berguna. Seterusnya, tambahkan pakej NBench dan NBench.Runner yang saya nyatakan di atas. Inilah permulaan kaedah ujian prestasi NBench kami.

[PerfBenchmark (NumberOfIterations = 1, RunMode = RunMode.Throughput,

TestMode = TestMode.Test, SkipWarmups = true)]

[ElapsedTimeAssertion (MaxTimeMilliseconds = 5000)]

kekosongan awam Benchmark_Performance_ElaspedTime ()

{

    // Tuliskan kod anda untuk ditanda aras di sini

}

Perhatikan bahawa kerana kita adalah prestasi penanda aras, kita perlu menandakan kaedah kita menggunakan PerfBenchmarkatribut. Atribut ini memberitahu pelari apa yang harus dilakukan dengan kaedah ini. Kita juga perlu memasukkan satu atau lebih atribut pengukuran. Oleh kerana kami menguji kecepatan pelaksanaan, kami menggunakan ElapsedTimeAssertionatribut untuk menentukan waktu di mana kaedah tersebut harus diselesaikan. Terdapat banyak atribut penegasan lain yang boleh anda manfaatkan. Penegasan yang disokong dalam NBench merangkumi yang berikut:

  • MemoryAssertionAttribute
  • GcTotalAssertionAttribute
  • ElapsedTimeAssertionAttribute
  • CounterTotalAssertionAttribute
  • GcThroughputAssertionAttribute
  • CounterThroughputAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute

Kaedah berikut menggambarkan bagaimana kita dapat menanda aras prestasi pengumpul sampah. The Benchmark_Performance_GCkaedah memberikan kita max, min, purata, dan sisihan piawai koleksi yang berlaku bagi setiap tiga generasi GC (generasi 0, 1, dan 2).

[PerfBenchmark (RunMode = RunMode.Iterations, TestMode = TestMode.Measurement)]

[Pengukuran Gc (GcMetric.TotalCollections, GcGeneration.AllGc)]

tolak am awam Benchmark_Performance_GC ()

{

    // Tuliskan kod anda untuk ditanda aras di sini

}

Sekiranya anda ingin membuat penanda aras prestasi berdasarkan penggunaan memori, berikut adalah kaedah ujian yang boleh anda gunakan.

[PerfBenchmark (Penerangan,

NumberOfIterations = 5, RunMode = RunMode.Throughput, RunTimeMilliseconds = 2500, TestMode = TestMode.Test)]

[MemoryAssertion (MemoryMetric.TotalBytesAllocated, MustBe.LessThanOrEqualTo, ByteConstants.SixtyFourKb)]

tanda kosong awam_Performance_Memory ()

{

    // Tuliskan kod anda untuk ditanda aras di sini

}

The MemoryAssertionatribut boleh digunakan untuk menentukan bahawa anda mahu menyekat kaedah di bawah ujian untuk mengambil tidak lebih daripada amaun yang dinyatakan memori dalam setiap larian penanda aras. Sebagai contoh, jika kaedah yang ditunjukkan di atas memakan lebih daripada 64KB memori, ujian tersebut dianggap gagal.

Perhatikan bahawa dalam setiap contoh kod yang telah saya tunjukkan di atas, saya melangkau kod yang hendak ditanda aras. Menanda aras kaedah aplikasi anda adalah perkara mudah untuk menampal kod anda ke kaedah penanda aras yang telah saya nyatakan.

Rangka kerja profil prestasi sumber terbuka, lintas platform, automatik untuk aplikasi .NET, NBench menjadikan prestasi dan ujian tekanan hampir semudah menulis dan melaksanakan ujian unit. Anda boleh mengintegrasikan NBench dengan rangka kerja pengujian unit dengan mudah seperti NUnit. Anda bahkan boleh mengintegrasikan NBench dengan xUnit dan menjalankan ujian di ReSharper atau Visual Studio Test Explorer. Anda boleh mengetahui lebih lanjut mengenai NBench di GitHub dan di laman web Petabridge.