Bagaimana menulis tes kinerja menggunakan NBench

Saat bekerja dengan aplikasi, Anda akan sering ingin mengetahui alokasi memori, overhead pengumpulan sampah (GC), dan throughput kode. Aplikasi Anda mungkin lambat, atau menghabiskan banyak sumber daya, dan Anda ingin mencari tahu apa yang salah.

Meskipun Anda dapat mendeteksi masalah fungsional dan kerusakan kode menggunakan pengujian unit dan tinjauan kode, Anda mungkin masih memerlukan cara untuk mengisolasi masalah kinerja. Di sinilah NBench berguna. Artikel ini menyajikan diskusi tentang NBench dan bagaimana kita dapat menggunakannya untuk menulis tes kinerja untuk aplikasi .NET.

Apa itu NBench? Mengapa saya harus menggunakannya?

NBench adalah kerangka pengujian kinerja populer yang dapat digunakan untuk membuat profil kinerja metode dalam aplikasi kita. NBench dapat mengukur throughput kode aplikasi Anda, alokasi memori, dan overhead GC yang terlibat dalam pengambilan kembali memori dengan membersihkan objek yang tidak diinginkan.

Anda dapat memanfaatkan NBench untuk "menguji unit" kinerja aplikasi Anda dengan cara yang sama seperti Anda menulis pengujian unit menggunakan kerangka kerja XUnit atau NUnit. Hal yang paling saya sukai dari NBench adalah ia dapat diintegrasikan ke dalam pipeline build Anda. Dan meskipun NBench memiliki pelari sendiri, Anda masih dapat menjalankan NBench menggunakan NUnit atau Resharper. Rasanya seperti menjalankan pengujian unit Anda.

NBench didistribusikan sebagai paket NuGet. Dengan asumsi bahwa Visual Studio sudah diinstal di sistem Anda, Anda dapat menginstal NBench melalui manajer paket NuGet atau dengan menggunakan perintah berikut di konsol manajer paket.

Instal-Paket NBench

Anda juga harus menginstal paket NBench.Runner, yang digunakan untuk menjalankan benchmark Anda. Anda juga dapat melakukannya melalui NuGet, atau menjalankan perintah berikut dari konsol manajer paket.

Instal-Paket NBench.Runner

Jika Anda seperti saya, Anda pasti ingin menjalankan tes kinerja NBench Anda menggunakan NUnit. Anda mungkin juga mempertimbangkan untuk menggunakan Pro.NBench.xUnit. Pro.NBench.xUnit memungkinkan Anda menemukan, menjalankan, atau men-debug pengujian NBench menggunakan xUnit di ReSharper. 

Menulis tes kinerja menggunakan NBench

Mari jelajahi bagaimana kita dapat menulis dan menjalankan tes kinerja menggunakan NBench. Buat proyek perpustakaan kelas baru, dan simpan dengan nama yang membantu. Selanjutnya, tambahkan paket NBench dan NBench.Runner yang saya sebutkan di atas. Inilah awal dari metode uji kinerja NBench kami.

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

TestMode = TestMode.Test, SkipWarmups = true)]

[ElapsedTimeAssertion (MaxTimeMilliseconds = 5000)]

public void Benchmark_Performance_ElaspedTime ()

{

    // Tulis kode Anda untuk dijadikan tolok ukur di sini

}

Perhatikan bahwa karena kita mengukur kinerja, kita perlu menandai metode kita menggunakan PerfBenchmarkatribut. Atribut ini memberi tahu pelari apa yang harus dilakukan dengan metode ini. Kita juga perlu menyertakan satu atau lebih atribut pengukuran. Karena kami menguji kecepatan eksekusi, kami menggunakan ElapsedTimeAssertionatribut untuk menentukan waktu di mana metode harus selesai. Ada banyak atribut assertion lain yang dapat Anda manfaatkan. Pernyataan yang didukung di NBench meliputi:

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

Metode berikut mengilustrasikan bagaimana kita dapat mengukur kinerja pengumpul sampah. The Benchmark_Performance_GCMetode memberi kita max, min, rata-rata, dan standar deviasi dari koleksi yang terjadi untuk masing-masing tiga generasi GC (generasi 0, 1, dan 2).

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

[GcMeasurement (GcMetric.TotalCollections, GcGeneration.AllGc)]

public void Benchmark_Performance_GC ()

{

    // Tulis kode Anda untuk dijadikan tolok ukur di sini

}

Jika Anda ingin mengukur kinerja berdasarkan konsumsi memori, berikut adalah metode pengujian yang dapat Anda gunakan.

[PerfBenchmark (Deskripsi,

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

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

public void Benchmark_Performance_Memory ()

{

    // Tulis kode Anda untuk dijadikan tolok ukur di sini

}

The MemoryAssertionatribut dapat digunakan untuk menentukan bahwa Anda ingin membatasi metode yang diuji untuk mengkonsumsi tidak lebih dari jumlah tertentu dari memori di setiap menjalankan benchmark. Sebagai contoh, jika metode yang ditunjukkan di atas mengkonsumsi lebih dari 64KB memori, pengujian dianggap gagal.

Perhatikan bahwa dalam setiap contoh kode yang saya tunjukkan di atas, saya melewatkan kode yang akan dijadikan patokan. Membandingkan metode aplikasi Anda adalah masalah sederhana dengan menempelkan kode Anda ke metode benchmark yang telah saya tunjukkan.

Kerangka kerja profil kinerja otomatis sumber terbuka lintas platform untuk aplikasi .NET, NBench membuat pengujian kinerja dan stres hampir semudah menulis dan melaksanakan pengujian unit. Anda dapat dengan mudah mengintegrasikan NBench dengan kerangka pengujian unit seperti NUnit. Anda bahkan dapat mengintegrasikan NBench dengan xUnit dan menjalankan tes di ReSharper atau Visual Studio Test Explorer. Anda dapat mempelajari lebih lanjut tentang NBench di GitHub dan di situs web Petabridge.