Cara benchmark kode C # menggunakan BenchmarkDotNet

BenchmarkDotNet adalah pustaka .NET ringan, sumber terbuka, dan kuat yang dapat mengubah metode Anda menjadi tolok ukur, melacak metode tersebut, dan kemudian memberikan wawasan tentang data kinerja yang diambil. Mudah untuk menulis benchmark BenchmarkDotNet dan hasil dari proses benchmarking juga ramah pengguna.

Anda dapat memanfaatkan BenchmarkDotNet untuk mengukur aplikasi .NET Framework dan .NET Core. Pada artikel ini kita akan menjelajahi bagaimana kita dapat bekerja dengan BenchmarkDotNet di .NET Core. Anda dapat menemukan BenchmarkDotNet di GitHub.

Untuk bekerja dengan contoh kode yang disediakan dalam artikel ini, Anda harus menginstal Visual Studio 2019 di sistem Anda. Jika Anda belum memiliki salinannya, Anda dapat mengunduh Visual Studio 2019 di sini. 

Buat proyek aplikasi konsol di Visual Studio

Pertama, mari buat proyek aplikasi konsol .NET Core di Visual Studio. Dengan asumsi Visual Studio 2019 diinstal di sistem Anda, ikuti langkah-langkah yang diuraikan di bawah ini untuk membuat proyek aplikasi konsol .NET Core baru di Visual Studio.

  1. Luncurkan Visual Studio IDE.
  2. Klik "Buat proyek baru".
  3. Di jendela "Buat proyek baru", pilih "Aplikasi Konsol (.NET Core)" dari daftar template yang ditampilkan.
  4. Klik Next.
  5. Di jendela "Configure your new project" yang ditampilkan berikutnya, tentukan nama dan lokasi untuk proyek baru tersebut.
  6. Klik Buat.

Ini akan membuat proyek aplikasi konsol .NET Core baru di Visual Studio 2019.

Perhatikan bahwa ketika Anda membuat proyek aplikasi konsol, kelas Program yang dihasilkan (dibuat secara otomatis dalam file Program.cs) akan terlihat seperti ini:

Program kelas

{

   static void Main (string [] args)

  {

      Console.WriteLine ("Hello World!");

  }

}

Kami akan menggunakan proyek ini dan kelas Program untuk bekerja dengan BenchmarkDotNet di bagian selanjutnya dari artikel ini.

Instal paket BenchmarkDotNet NuGet

Untuk bekerja dengan BenchmarkDotNet Anda harus menginstal paket BenchmarkDotNet. Anda dapat melakukan ini baik melalui NuGet Package Manager di dalam Visual Studio 2019 IDE, atau dengan menjalankan perintah berikut di NuGet Package Manager Console:

Instal-Paket BenchmarkDotNet

Mengapa kode patokan?

Tolok ukur adalah pengukuran atau sekumpulan pengukuran yang terkait dengan kinerja sepotong kode dalam suatu aplikasi. Kode pembandingan sangat penting untuk memahami metrik kinerja metode dalam aplikasi Anda. Itu selalu merupakan pendekatan yang baik untuk memiliki metrik saat Anda mengoptimalkan kode. Sangat penting bagi kami untuk mengetahui apakah perubahan yang dilakukan dalam kode telah meningkatkan atau memperburuk kinerja. Benchmarking juga membantu Anda mempersempit bagian kode dalam aplikasi yang perlu refactoring.

Langkah-langkah untuk membandingan kode menggunakan BenchmarkDotNet

Untuk menjalankan BenchmarkDotNet di .NET Framework atau aplikasi .NET Core, Anda harus mengikuti langkah-langkah berikut:

  1. Tambahkan paket NuGet yang diperlukan
  2. Tambahkan atribut Benchmark ke metode Anda
  3. Buat instance BenchmarkRunner
  4. Jalankan aplikasi dalam mode Rilis

Buat kelas benchmarking di .NET Core

Buka file Program.cs dan tulis kode berikut di sana.

  [MemoryDiagnoser]

   kelas publik MemoryBenchmarkerDemo

    {

        int NumberOfItems = 100000;

        [Tolok Ukur]

        string publik ConcatStringsUsingStringBuilder ()

        {

            var sb = new StringBuilder ();

            untuk (int i = 0; i <NumberOfItems; i ++)

            {

                sb.Append ("Hello World!" + i);

            }

            return sb.ToString ();

        }

        [Tolok Ukur]

        string publik ConcatStringsUsingGenericList ()

        {

            var list = Daftar baru (NumberOfItems);

            untuk (int i = 0; i <NumberOfItems; i ++)

            {

                list.Add ("Hello World!" + i);

            }

            daftar kembali.ToString ();

        }

    }

Program di atas menggambarkan bagaimana Anda dapat menulis metode untuk benchmarking. Catat penggunaan atribut Benchmark di atas setiap metode yang akan dijadikan tolok ukur.

Dalam metode Utama dari file Program.cs Anda harus menentukan titik awal awal - kelas BenchmarkRunner. Ini adalah cara memberi tahu BenchmarkDotNet untuk menjalankan benchmark pada kelas yang ditentukan. Jadi, ganti kode default dari metode Utama di file Program.cs menggunakan potongan kode berikut.

static void Main (string [] args)

{

   var summary = BenchmarkRunner.Run ();

}

Jalankan benchmark di aplikasi .NET Core Anda

Jika Anda menjalankan aplikasi dalam mode debug, berikut adalah pesan kesalahan yang akan Anda lihat:

Saat melakukan benchmarking, Anda harus selalu memastikan bahwa Anda menjalankan proyek Anda dalam mode rilis. Alasannya adalah selama kompilasi, kode dioptimalkan secara berbeda untuk mode debug dan rilis. Kompilator C # melakukan beberapa pengoptimalan dalam mode rilis yang tidak tersedia dalam mode debug.

Oleh karena itu, Anda harus menjalankan proyek Anda hanya dalam mode rilis. Untuk menjalankan pembandingan, tentukan perintah berikut pada prompt perintah Visual Studio.

dotnet run -p BenchmarkDotNetDemo.csproj -c Rilis

Untuk hasil terbaik, Anda harus memastikan bahwa semua aplikasi ditutup dan semua proses yang tidak perlu dihentikan sebelum menjalankan benchmark.

Perhatikan bahwa jika Anda tidak menentukan parameter konfigurasi, runtime akan mencoba melakukan tolok ukur pada kode mode debug yang tidak dioptimalkan. Dan Anda akan disajikan dengan kesalahan yang sama seperti yang ditunjukkan pada Gambar 1.

Analisis hasil benchmarking

Setelah eksekusi proses benchmarking selesai, ringkasan hasil akan ditampilkan di jendela konsol. Bagian ringkasan berisi informasi yang berkaitan dengan lingkungan tempat benchmark dijalankan, seperti versi BenchmarkDotNet, sistem operasi, perangkat keras komputer, versi .NET, informasi kompiler, dan informasi yang terkait dengan kinerja aplikasi.

Beberapa file juga akan dibuat di folder BenchmarkDotNet.Artifacts di bawah folder root aplikasi. Berikut adalah ringkasan hasilnya. 

Seperti yang terlihat dari ringkasan yang ditunjukkan pada Gambar 2, untuk setiap metode benchmark, Anda akan melihat deretan data yang menentukan metrik kinerja seperti waktu eksekusi rata-rata, Gen 0, Gen 1, koleksi Gen 2, dll.

Saat memeriksa hasil yang ditunjukkan pada Gambar 3, Anda dapat melihat bahwa ConcatStringUsingGenericList jauh lebih cepat daripada metode ConcatStringUsingStringBuilder. Anda juga dapat melihat bahwa ada lebih banyak alokasi setelah menjalankan metode ConcatStringUsingStringBuilder.

Sekarang tambahkan atribut RankColumn di atas kelas MemoryBenchmarkerDemo. Ini akan menambahkan kolom tambahan ke keluaran yang menunjukkan metode mana yang lebih cepat. Jalankan lagi proses benchmarking menggunakan perintah berikut.

dotnet run -p BenchmarkDotNetDemo.csproj -c Rilis

Saat Anda menjalankan perintah ini, proses benchmarking dimulai dan menampilkan output setelah proses benchmarking berhasil dijalankan. Gambar 4 di bawah ini menunjukkan output dengan RankColumn yang ditambahkan. 

BenchmarkDotNet adalah alat yang bagus yang menyediakan cara sederhana untuk membuat keputusan yang tepat tentang metrik kinerja aplikasi Anda. Di BenchmarkDotNet, pemanggilan metode yang memiliki set atribut Benchmark dikenal sebagai operasi. Iterasi adalah nama yang diberikan untuk kumpulan beberapa operasi. 

Anda dapat menjelajahi demo aplikasi ASP.NET Core yang menggambarkan beberapa cara untuk benchmark kode. Anda bisa mendapatkan aplikasi dari repo ASP.NET di GitHub. 

Bagaimana melakukan lebih banyak di C #: 

  • Cara menguji unit metode statis di C #
  • Cara refactor objek Tuhan di C #
  • Cara menggunakan ValueTask di C #
  • Cara menggunakan kekekalan di C
  • Cara menggunakan const, readonly, dan static di C #
  • Cara menggunakan anotasi data di C #
  • Cara bekerja dengan GUID di C # 8
  • Kapan menggunakan kelas abstrak vs. antarmuka di C #
  • Bagaimana bekerja dengan AutoMapper di C #
  • Cara menggunakan ekspresi lambda di C #
  • Cara bekerja dengan delegasi Action, Func, dan Predicate di C #
  • Bagaimana bekerja dengan delegasi di C #
  • Bagaimana menerapkan logger sederhana di C #
  • Bagaimana bekerja dengan atribut di C #
  • Bagaimana bekerja dengan log4net di C #
  • Bagaimana menerapkan pola desain repositori di C #
  • Bagaimana bekerja dengan refleksi di C #
  • Bagaimana bekerja dengan filesystemwatcher di C #
  • Bagaimana melakukan inisialisasi malas di C #
  • Bagaimana bekerja dengan MSMQ di C #
  • Bagaimana bekerja dengan metode ekstensi di C #
  • Bagaimana kami ekspresi lambda di C #
  • Kapan menggunakan kata kunci volatile di C #
  • Cara menggunakan kata kunci hasil di C #
  • Bagaimana menerapkan polimorfisme di C #
  • Cara membuat penjadwal tugas Anda sendiri di C #
  • Bagaimana bekerja dengan RabbitMQ di C #
  • Bagaimana bekerja dengan tupel di C #
  • Menjelajahi metode virtual dan abstrak di C #
  • Cara menggunakan Dapper ORM di C #
  • Cara menggunakan pola desain kelas terbang di C #