Panduan pemula untuk mengoptimalkan kode dan mengurangi biaya komputasi (C#, Visual Basic, C++, F#)

Mengurangi waktu komputasi berarti mengurangi biaya, sehingga mengoptimalkan kode Anda dapat menghemat uang. Dalam artikel ini, kami menunjukkan bagaimana Anda dapat menggunakan berbagai alat pembuatan profil untuk membantu Anda menyelesaikan tugas ini.

Daripada memberikan instruksi langkah demi langkah, niat di sini adalah untuk menunjukkan kepada Anda cara menggunakan alat pembuatan profil secara efektif dan cara menginterpretasikan data. Alat Penggunaan CPU dapat membantu Anda mengambil dan memvisualisasikan di mana sumber daya komputasi digunakan dalam aplikasi Anda. Tampilan Penggunaan CPU seperti pohon panggilan dan grafik api memberikan visualisasi grafis yang bagus di mana waktu dihabiskan di aplikasi Anda. Selain itu, wawasan otomatis dapat menunjukkan pengoptimalan yang tepat yang dapat berdampak besar. Alat pembuatan profil lainnya juga dapat membantu Anda mengisolasi masalah. Untuk membandingkan alat, lihat Alat mana yang harus saya pilih?

Memulai penyelidikan

  • Mulai penyelidikan Anda dengan mengambil jejak penggunaan CPU. Alat Penggunaan CPU sering kali membantu untuk memulai investigasi performa dan mengoptimalkan kode untuk mengurangi biaya.
  • Selanjutnya, jika Anda ingin wawasan tambahan untuk membantu mengisolasi masalah atau meningkatkan performa, pertimbangkan untuk mengumpulkan jejak menggunakan salah satu alat pembuatan profil lainnya. Misalnya:
    • Lihat penggunaan memori. Untuk .NET, coba alat Alokasi Objek .NET terlebih dahulu. Untuk .NET atau C++, Anda dapat melihat alat Penggunaan Memori.
    • Jika aplikasi Anda menggunakan I/O File, gunakan alat I/O File.
    • Jika Anda menggunakan ADO.NET atau Kerangka Kerja Entitas, Anda dapat mencoba alat Database untuk memeriksa kueri SQL, waktu kueri yang tepat, dkk.

Contoh pengumpulan data

Contoh cuplikan layar yang ditampilkan dalam artikel ini didasarkan pada aplikasi .NET yang menjalankan kueri terhadap database blog dan posting blog terkait. Anda akan terlebih dahulu memeriksa jejak penggunaan CPU untuk mencari peluang untuk mengoptimalkan kode dan mengurangi biaya komputasi. Setelah mendapatkan gambaran umum tentang apa yang terjadi, Anda juga akan melihat jejak dari alat pembuatan profil lainnya untuk membantu mengisolasi masalah.

Pengumpulan data memerlukan langkah-langkah berikut (tidak ditampilkan di sini):

  • Mengatur aplikasi Anda ke build Rilis
  • Pilih alat Penggunaan CPU dari Profiler Performa (Alt+F2). (Langkah selanjutnya melibatkan beberapa alat lainnya.)
  • Dari Profiler Performa, mulai aplikasi dan kumpulkan jejak.

Memeriksa area penggunaan CPU yang tinggi

Mulailah dengan mengumpulkan jejak dengan alat Penggunaan CPU. Saat data diagnostik dimuat, pertama-tama periksa halaman laporan .diagsession awal yang menampilkan Wawasan Teratas dan Jalur Panas. Jalur Panas menampilkan jalur kode dengan penggunaan CPU tertinggi di aplikasi Anda. Bagian ini dapat memberikan tips untuk membantu Anda mengidentifikasi masalah performa yang dapat Anda tingkatkan dengan cepat.

Anda juga dapat melihat jalur panas di tampilan Pohon Panggilan. Untuk membuka tampilan ini, gunakan tautan Buka detail dalam laporan lalu pilih Pohon Panggilan.

Dalam tampilan ini, Anda melihat jalur panas lagi, yang menunjukkan penggunaan CPU yang tinggi untuk GetBlogTitleX metode di aplikasi, menggunakan sekitar 60% bagian dari penggunaan CPU aplikasi. Namun, nilai CPU Mandiri untuk GetBlogTitleX rendah, hanya sekitar .10%. Tidak seperti Total CPU, nilai CPU Mandiri mengecualikan waktu yang dihabiskan dalam fungsi lain, jadi kita tahu untuk melihat lebih jauh ke bawah tampilan Pohon Panggilan untuk hambatan nyata.

Cuplikan layar tampilan Pohon Panggilan di alat Penggunaan CPU.

GetBlogTitleXmelakukan panggilan eksternal ke dua DLL LINQ, yang menggunakan sebagian besar waktu CPU, sebagaimana dibuktikan oleh nilai CPU Mandiri yang sangat tinggi. Ini adalah petunjuk pertama yang mungkin ingin Anda cari kueri LINQ sebagai area untuk dioptimalkan.

Cuplikan layar tampilan Pohon Panggilan di alat Penggunaan CPU dengan CPU Mandiri disorot.

Untuk mendapatkan pohon panggilan yang divisualisasikan dan tampilan data yang berbeda, beralihlah ke tampilan Grafik Api (pilih dari daftar yang sama dengan Pohon Panggilan). Di sini lagi, sepertinya GetBlogTitleX metode ini bertanggung jawab atas banyak penggunaan CPU aplikasi (ditampilkan dalam warna kuning). Panggilan eksternal ke DLL LINQ muncul di bawah GetBlogTitleX kotak, dan mereka menggunakan semua waktu CPU untuk metode tersebut.

Cuplikan layar tampilan Grafik Api di alat Penggunaan CPU.

Mengumpulkan data tambahan

Seringkali, alat lain dapat memberikan informasi tambahan untuk membantu analisis dan mengisolasi masalah. Untuk contoh ini, kami mengambil pendekatan berikut:

  • Pertama, kita akan melihat penggunaan memori. Mungkin ada korelasi antara penggunaan CPU yang tinggi dan penggunaan memori yang tinggi, sehingga dapat membantu untuk melihat keduanya untuk mengisolasi masalah.
  • Karena kami mengidentifikasi DLL LINQ, kami juga akan melihat alat Database.

Periksa penggunaan memori

Untuk melihat apa yang terjadi dengan aplikasi dalam hal penggunaan memori, kumpulkan jejak menggunakan alat Alokasi Objek .NET (Untuk C++, gunakan alat Penggunaan Memori sebagai gantinya). Tampilan Pohon Panggilan dalam jejak memori menunjukkan jalur panas dan membantu Anda mengidentifikasi area penggunaan memori tinggi. Tidak mengherankan pada saat ini, metode ini GetBlogTitleX tampaknya menghasilkan banyak objek! Lebih dari 900.000 alokasi objek, pada kenyataannya.

Cuplikan layar tampilan Pohon Panggilan di alat Alokasi Objek .NET.

Sebagian besar objek yang dibuat adalah string, array objek, dan Int32. Anda mungkin dapat melihat bagaimana jenis ini dihasilkan dengan memeriksa kode sumber.

Periksa kueri di alat Database

Anda dapat memilih beberapa alat Database bersama dengan Penggunaan CPU. Saat Anda telah mengumpulkan jejak, pilih tab Kueri di halaman diagnostik. Di tab Kueri untuk jejak Database, Anda bisa melihat baris pertama memperlihatkan kueri terpanjang, 2446 mdtk. Kolom Rekaman memperlihatkan berapa banyak rekaman yang dibaca kueri. Kita dapat menggunakan informasi ini untuk perbandingan nanti.

Cuplikan layar kueri Database di alat Database.

Dengan memeriksa pernyataan yang SELECT dihasilkan oleh LINQ di kolom Kueri, Anda mengidentifikasi baris pertama sebagai kueri yang terkait dengan GetBlogTitleX metode . Untuk menampilkan string kueri lengkap, perluas lebar kolom jika perlu. String kueri lengkapnya adalah:

SELECT "b"."Url", "b"."BlogId", "p"."PostId", "p"."Author", "p"."BlogId", "p"."Content", "p"."Date", "p"."MetaData", "p"."Title"
FROM "Blogs" AS "b" LEFT JOIN "Posts" AS "p" ON "b"."BlogId" = "p"."BlogId" ORDER BY "b"."BlogId"

Perhatikan bahwa Anda mengambil banyak nilai kolom di sini, mungkin lebih dari yang Anda butuhkan. Mari kita lihat kode sumbernya.

Optimalkan kode

Saatnya untuk melihat GetBlogTitleX kode sumber. Di alat Database, klik kanan kueri dan pilih Buka File Sumber. Dalam kode sumber untuk GetBlogTitleX, kami menemukan kode berikut yang menggunakan LINQ untuk membaca database.

foreach (var blog in db.Blogs.Select(b => new { b.Url, b.Posts }).ToList())
  {
    foreach (var post in blog.Posts)
    {
      if (post.Author == "Fred Smith")
      {
        Console.WriteLine($"Post: {post.Title}");
      }
  }
}

Kode ini menggunakan foreach perulangan untuk mencari database untuk blog apa pun dengan "Fred Smith" sebagai penulis. Melihatnya, Anda dapat melihat bahwa banyak objek dihasilkan dalam memori: array objek baru untuk setiap blog dalam database, string terkait untuk setiap URL, dan nilai untuk properti yang terkandung dalam postingan, seperti ID blog.

Anda melakukan sedikit penelitian dan menemukan beberapa rekomendasi umum tentang cara mengoptimalkan kueri LINQ dan membuat kode ini.

foreach (var x in db.Posts.Where(p => p.Author.Contains("Fred Smith")).Select(b => b.Title).ToList())
{
  Console.WriteLine("Post: " + x);
}

Dalam kode ini, Anda membuat beberapa perubahan untuk membantu mengoptimalkan kueri:

  • Where Menambahkan klausul dan menghilangkan salah satu perulanganforeach.
  • Hanya diproyeksikan properti Judul dalam Select pernyataan, yang merupakan semua yang Anda butuhkan dalam contoh ini.

Selanjutnya, coba lagi menggunakan alat pembuatan profil.

Periksa hasilnya

Setelah memperbarui kode, jalankan kembali alat Penggunaan CPU untuk mengumpulkan jejak. Tampilan Pohon Panggilan menunjukkan bahwa GetBlogTitleX hanya berjalan 1754 ms, menggunakan 37% dari total CPU aplikasi, peningkatan signifikan dari 59%.

Cuplikan layar penggunaan CPU yang ditingkatkan dalam tampilan Pohon Panggilan alat Penggunaan CPU.

Beralih ke tampilan Grafik Api untuk melihat visualisasi lain dari penyempurnaan. Dalam tampilan ini, GetBlogTitleX juga menggunakan bagian CPU yang lebih kecil.

Cuplikan layar penggunaan CPU yang ditingkatkan dalam tampilan Grafik Api alat Penggunaan CPU.

Periksa hasilnya di pelacakan alat Database, dan hanya dua rekaman yang dibaca menggunakan kueri ini, bukan 100.000! Selain itu, kueri jauh disederhanakan dan menghilangkan LEFT JOIN yang tidak perlu yang dihasilkan sebelumnya.

Cuplikan layar waktu kueri yang lebih cepat di alat Database.

Selanjutnya, periksa ulang hasilnya di alat Alokasi Objek .NET, dan lihat bahwa GetBlogTitleX hanya bertanggung jawab atas 56.000 alokasi objek, hampir 95% pengurangan dari 900.000!

Cuplikan layar pengurangan alokasi memori di alat Alokasi Objek .NET.

Iterate

Beberapa pengoptimalan mungkin diperlukan dan Anda dapat terus melakukan iterasi dengan perubahan kode untuk melihat perubahan mana yang meningkatkan performa dan mengurangi biaya komputasi Anda.

Langkah berikutnya

Posting blog berikut memberikan informasi lebih lanjut untuk membantu Anda belajar menggunakan alat performa Visual Studio secara efektif.