Pengoptimalan yang dipandu profil

Pengoptimalan yang dipandu profil (PGO) memungkinkan Anda mengoptimalkan seluruh file yang dapat dieksekusi, di mana pengoptimal menggunakan data dari eksekusi pengujian file .exe atau .dll. Data mewakili kemungkinan performa program di lingkungan produksi.

Pengoptimalan yang dipandu profil hanya tersedia untuk target asli x86, x64, atau ARM64. Pengoptimalan yang dipandu profil tidak tersedia untuk file yang dapat dieksekusi yang berjalan pada runtime bahasa umum. Bahkan jika Anda menghasilkan rakitan dengan kode asli dan terkelola campuran (dengan menggunakan opsi pengompilasi /clr ), Anda tidak dapat menggunakan pengoptimalan yang dipandu profil hanya pada kode asli. Jika Anda mencoba membangun proyek dengan opsi ini yang diatur dalam IDE, hasil kesalahan build.

Catatan

Informasi yang dikumpulkan dari pengujian pembuatan profil menjalankan penimpaan pengoptimalan yang akan berlaku jika Anda menentukan /Ob, /Os, atau /Ot. Untuk informasi selengkapnya, lihat /Ob (Ekspansi Fungsi Sebaris) dan /Os, /Ot (Mendukung Kode Kecil, Mendukung Kode Cepat).

Langkah-langkah untuk mengoptimalkan aplikasi Anda

Untuk menggunakan pengoptimalan yang dipandu profil, ikuti langkah-langkah berikut untuk mengoptimalkan aplikasi Anda:

  • Kompilasi satu atau beberapa file kode sumber dengan /GL.

    Setiap modul yang dibangun dengan /GL dapat diperiksa selama pengujian pengoptimalan yang dipandu profil untuk menangkap perilaku run-time. Setiap modul dalam build pengoptimalan yang dipandu profil tidak harus dikompilasi dengan /GL. Namun, hanya modul yang dikompilasi dengan /GL yang diinstrumentasikan dan nantinya tersedia untuk pengoptimalan yang dipandu profil.

  • Tautkan menggunakan /LTCG dan /GENPROFILE atau /FASTGENPROFILE.

    Menggunakan /LTCG dan /GENPROFILE atau /FASTGENPROFILE membuat file saat aplikasi berinstrumen .pgd dijalankan. Setelah data uji-jalan ditambahkan ke .pgd file, data dapat digunakan sebagai input ke langkah tautan berikutnya (membuat gambar yang dioptimalkan). Saat menentukan /GENPROFILE, Anda dapat secara opsional menambahkan argumen PGD=nama file untuk menentukan nama atau lokasi nondefault untuk file tersebut.pgd. Kombinasi opsi linker /LTCG dan /GENPROFILE atau /FASTGENPROFILE menggantikan opsi linker /LTCG:PGINSTRUMENT yang tidak digunakan lagi.

  • Profilkan aplikasi.

    Setiap kali sesi EXE yang di-profil berakhir, atau DLL yang dibuat profilnya dibongkar, appname!N.pgc file dibuat. File .pgc berisi informasi tentang eksekusi pengujian aplikasi tertentu. appname adalah nama aplikasi Anda, dan N adalah angka yang dimulai dengan 1 yang ditambahkan berdasarkan jumlah file lain appname!N.pgc di direktori. Anda dapat menghapus .pgc file jika uji coba tidak mewakili skenario yang ingin Anda optimalkan.

    Selama uji coba, Anda dapat memaksa penutupan file yang saat ini terbuka .pgc dan pembuatan file baru .pgc dengan utilitas pgosweep (misalnya, ketika akhir skenario pengujian tidak bertepatan dengan pematian aplikasi).

    Aplikasi Anda juga dapat langsung memanggil fungsi PGO, PgoAutoSweep, untuk mengambil data profil di titik panggilan sebagai .pgc file. Ini dapat memberi Anda kontrol yang lebih baik atas kode yang dicakup oleh data yang diambil dalam file Anda .pgc . Untuk contoh cara menggunakan fungsi ini, lihat dokumentasi PgoAutoSweep .

    Saat Anda membuat build berinstrumentasi, secara default, pengumpulan data dilakukan dalam mode non-thread-safe, yang lebih cepat tetapi mungkin tidak tepat. Dengan menggunakan argumen EXACT ke /GENPROFILE atau /FASTGENPROFILE, Anda dapat menentukan pengumpulan data dalam mode aman utas, yang lebih tepat, tetapi lebih lambat. Opsi ini juga tersedia jika Anda mengatur variabel lingkungan Pogo Brankas Mode yang tidak digunakan lagi, atau opsi penghubung /POGOSAFEMODE yang tidak digunakan lagi, saat Anda membuat build berinstrumentasi.

  • Tautkan menggunakan /LTCG dan /USEPROFILE.

    Gunakan opsi linker /LTCG dan /USEPROFILE untuk membuat gambar yang dioptimalkan. Langkah ini mengambil sebagai input .pgd file. Saat Anda menentukan /USEPROFILE, Anda dapat secara opsional menambahkan argumen PGD=nama file untuk menentukan nama atau lokasi non-default untuk file tersebut .pgd . Anda juga dapat menentukan nama ini dengan menggunakan opsi linker /PGD yang tidak digunakan lagi. Kombinasi /LTCG dan /USEPROFILE menggantikan opsi linker /LTCG:PGOPTIMIZE dan /LTCG:PGUPDATE yang tidak digunakan lagi.

Bahkan dimungkinkan untuk membuat file yang dapat dieksekusi yang dioptimalkan dan kemudian menentukan bahwa pembuatan profil tambahan akan berguna untuk membuat gambar yang lebih dioptimalkan. Jika gambar berinstrumen dan filenya .pgd tersedia, Anda dapat melakukan uji coba tambahan dan membangun kembali gambar yang dioptimalkan dengan file yang lebih .pgd baru, dengan menggunakan opsi linker /LTCG dan /USEPROFILE yang sama.

Catatan

File .pgc dan .pgd keduanya adalah jenis file biner. Jika disimpan dalam sistem kontrol sumber, hindari transformasi otomatis yang mungkin dibuat ke file teks.

Pengoptimalan yang dilakukan oleh PGO

Pengoptimalan yang dipandu profil mencakup pemeriksaan dan peningkatan ini:

  • Inlining - Misalnya, jika fungsi A sering memanggil fungsi B, dan fungsi B relatif kecil, maka pengoptimalan yang dipandu profil fungsi sebaris B dalam fungsi A.

  • Spekulasi Panggilan Virtual - Jika panggilan virtual, atau panggilan lain melalui penunjuk fungsi, sering menargetkan fungsi tertentu, pengoptimalan yang dipandu profil dapat menyisipkan panggilan langsung yang dijalankan secara kondisional ke fungsi yang sering ditargetkan, dan panggilan langsung dapat di-inlin.

  • Daftarkan Alokasi - Pengoptimalan berdasarkan data profil menghasilkan alokasi pendaftaran yang lebih baik.

  • Pengoptimalan Blok Dasar - Pengoptimalan blok dasar memungkinkan blok dasar yang dijalankan secara temporal dalam bingkai tertentu untuk ditempatkan di kumpulan halaman (lokalitas) yang sama. Ini meminimalkan jumlah halaman yang digunakan, yang meminimalkan overhead memori.

  • Pengoptimalan Ukuran/Kecepatan - Fungsi di mana program menghabiskan waktu eksekusi terbanyak dapat dioptimalkan untuk kecepatan.

  • Tata Letak Fungsi - Berdasarkan grafik panggilan dan perilaku pemanggil/callee yang di-profil, fungsi yang cenderung berada di sepanjang jalur eksekusi yang sama ditempatkan di bagian yang sama.

  • Pengoptimalan Cabang Bersyarat - Dengan pemeriksaan nilai, pengoptimalan yang dipandu profil dapat menemukan apakah nilai tertentu dalam pernyataan pengalihan digunakan lebih sering daripada nilai lain. Nilai ini kemudian dapat ditarik keluar dari pernyataan switch. Hal yang sama dapat dilakukan dengan if...else instruksi di mana pengoptimal dapat memesan if...else sehingga if blok atau else ditempatkan terlebih dahulu, tergantung pada blok mana yang lebih sering benar.

  • Pemisahan Kode Mati - Kode yang tidak dipanggil selama pembuatan profil dipindahkan ke bagian khusus yang ditambahkan ke akhir kumpulan bagian. Ini secara efektif menjaga bagian ini keluar dari halaman yang sering digunakan.

  • Pemisahan Kode EH - Karena kode EH hanya dijalankan secara luar biasa, kode tersebut sering kali dapat dipindahkan ke bagian terpisah. Ini dipindahkan ketika pengoptimalan yang dipandu profil dapat menentukan bahwa pengecualian hanya terjadi pada kondisi yang luar biasa.

  • Intrinsik Memori - Apakah akan memperluas intrinsik atau tidak tergantung pada apakah itu sering dipanggil. Intrinsik juga dapat dioptimalkan berdasarkan ukuran blok pemindahan atau salinan.

Langkah berikutnya

Baca selengkapnya tentang variabel, fungsi, dan alat lingkungan ini yang dapat Anda gunakan dalam pengoptimalan yang dipandu profil:

Variabel lingkungan untuk pengoptimalan yang dipandu profil
Variabel ini digunakan untuk menentukan perilaku run-time skenario pengujian. Mereka sekarang tidak digunakan lagi dan digantikan oleh opsi linker baru. Dokumen ini memperlihatkan kepada Anda cara berpindah dari variabel lingkungan ke opsi linker.

PgoAutoSweep
Fungsi yang dapat Anda tambahkan ke aplikasi untuk menyediakan kontrol pengambilan data file yang .pgc halus.

pgosweep
Utilitas baris perintah yang menulis semua data profil ke .pgc file, menutup .pgc file, dan membuka file baru .pgc .

pgomgr
Utilitas baris perintah yang menambahkan data profil dari satu atau beberapa .pgc file ke .pgd file.

Cara: Menggabungkan beberapa profil PGO ke dalam satu profil
Contoh penggunaan pgomgr.

Baca juga

Alat build MSVC tambahan