Pengoptimalan yang dipandu profil
Profile-guided optimization (PGO) memungkinkan Anda mengoptimalkan seluruh file yang dapat dieksekusi, di mana pengoptimal menggunakan data dari uji coba .exe atau file .dll. Data mewakili kemungkinan kinerja program dalam lingkungan produksi.
Pengoptimalan yang dipandu profil hanya tersedia untuk target asli x86 atau x64. Pengoptimalan yang dipandu profil tidak tersedia untuk file yang dapat dieksekusi yang berjalan pada runtime bahasa umum. Bahkan jika Anda menghasilkan perakitan dengan kode asli dan terkelola campuran (dengan menggunakan opsi kompiler /clr ), Anda tidak dapat menggunakan pengoptimalan yang dipandu profil hanya pada kode asli. Jika Anda mencoba membangun proyek dengan opsi ini yang ditetapkan dalam IDE, kesalahan build akan terjadi.
Catatan
Informasi yang dikumpulkan dari uji profil berjalan mengesampingkan pengoptimalan yang seharusnya berlaku jika Anda menentukan /Ob, /Os, atau /Ot. Untuk informasi lebih lanjut, lihat /Ob (Inline Function Expansion) dan /Os, /Ot (Favor Small Code, Favor Fast Code).
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 uji 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-modul yang dikompilasi dengan /GL yang diinstrumentasi dan kemudian tersedia untuk pengoptimalan yang dipandu profil.
Tautkan menggunakan /LTCG dan /GENPROFILE atau /FASTGENPROFILE.
Menggunakan /LTCG dan /GENPROFILE atau /FASTGENPROFILE membuat
.pgdfile saat aplikasi yang diinstrumentasi dijalankan. Setelah data uji coba ditambahkan ke.pgdfile, data tersebut 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.Profil aplikasi.
Setiap kali sesi EXE yang diprofilkan berakhir, atau DLL yang diprofilkan dibongkar,
appname!N.pgcfile dibuat. File.pgcberisi informasi tentang uji coba aplikasi tertentu. appname adalah nama aplikasi Anda, dan N adalah angka yang dimulai dengan 1 yang bertambah berdasarkan jumlah file lainappname!N.pgcdi direktori. Anda dapat menghapus.pgcfile jika uji coba tidak mewakili skenario yang ingin Anda optimalkan.Selama uji coba, Anda dapat memaksa penutupan file yang saat ini terbuka
.pgcdan pembuatan file baru.pgcdengan utilitas pgosweep (misalnya, ketika akhir skenario pengujian tidak bertepatan dengan penutupan aplikasi).Aplikasi Anda juga dapat langsung memanggil fungsi PGO, PgoAutoSweep, untuk menangkap data profil pada titik panggilan sebagai
.pgcfile. 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 yang diinstrumentasi, 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 PogoSafeMode yang tidak digunakan lagi, atau opsi tautan /POGOSAFEMODE yang tidak digunakan lagi, saat Anda membuat build yang diinstrumentasi.
Tautkan menggunakan /LTCG dan /USEPROFILE.
Gunakan opsi linker /LTCG dan /USEPROFILE untuk membuat gambar yang dioptimalkan. Langkah ini diambil sebagai input
.pgdfile. 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 tautan /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 executable yang dioptimalkan dan kemudian menentukan bahwa pembuatan profil tambahan akan berguna untuk membuat gambar yang lebih dioptimalkan. Jika gambar yang diinstrumentasi dan filenya .pgd tersedia, Anda dapat melakukan uji coba tambahan dan membangun kembali gambar yang dioptimalkan dengan file yang lebih baru .pgd , dengan menggunakan opsi tautan /LTCG dan /USEPROFILE yang sama.
Catatan
Keduanya .pgc dan .pgd file adalah jenis file biner. Jika disimpan dalam sistem kontrol sumber, hindari transformasi otomatis yang mungkin dilakukan ke file teks.
Optimalisasi 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 optimasi yang dipandu profil inline fungsi 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 memasukkan panggilan langsung yang dijalankan secara kondisional ke fungsi yang sering ditargetkan, dan panggilan langsung dapat diinlinasi.
Alokasi Pendaftaran - Pengoptimalan berdasarkan hasil data profil dalam alokasi register yang lebih baik.
Optimasi Blok Dasar - Optimasi blok dasar memungkinkan blok dasar yang umum dieksekusi yang temporal mengeksekusi dalam bingkai tertentu untuk ditempatkan dalam set halaman yang sama (lokalitas). Ini meminimalkan jumlah halaman yang digunakan, yang meminimalkan overhead memori.
Size / Speed Optimization - Fungsi di mana program menghabiskan waktu eksekusi paling banyak dapat dioptimalkan untuk kecepatan.
Tata Letak Fungsi - Berdasarkan grafik panggilan dan perilaku penelepon /callee yang diprofilkan, fungsi yang cenderung berada di sepanjang jalur eksekusi yang sama ditempatkan di bagian yang sama.
Optimasi Cabang Bersyarat - Dengan probe nilai, pengoptimalan yang dipandu profil dapat menemukan apakah nilai tertentu dalam pernyataan sakelar digunakan lebih sering daripada nilai lainnya. Nilai ini kemudian dapat ditarik keluar dari pernyataan switch. Hal yang sama dapat dilakukan dengan
ifinstruksi dielsemana pengoptimal dapat memesanif...elsesehingga blokifatauelseblok 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 membuat bagian ini keluar dari halaman yang sering digunakan.
Pemisahan Kode EH - Karena kode EH hanya dijalankan dengan luar biasa, kode tersebut sering dapat dipindahkan ke bagian terpisah. Ini dipindahkan ketika pengoptimalan yang dipandu profil dapat menentukan bahwa pengecualian hanya terjadi pada kondisi luar biasa.
Memori Intrinsik - Apakah akan memperluas intrinsik atau tidak tergantung pada apakah itu sering disebut. Intrinsik juga dapat dioptimalkan berdasarkan ukuran blok bergerak atau salinan.
Langkah berikutnya
Baca lebih lanjut tentang variabel, fungsi, dan alat lingkungan ini yang dapat Anda gunakan dalam pengoptimalan yang dipandu profil:
Variabel lingkungan untuk pengoptimalan yang dipandu profil
Variabel-variabel ini digunakan untuk menentukan perilaku run-time skenario pengujian. Mereka sekarang tidak digunakan lagi dan digantikan oleh opsi linker baru. Dokumen ini menunjukkan kepada Anda cara berpindah dari variabel lingkungan ke opsi linker.
PgoAutoSweep
Fungsi yang dapat Anda tambahkan ke aplikasi Anda untuk menyediakan kontrol pengambilan data file berbutir .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: Gabungkan beberapa profil PGO menjadi satu profil
Contoh penggunaan pgomgr .