Saya bertaruh saya bisa menjawabnya sendiri jika saya tahu lebih banyak tentang alat untuk menganalisis bagaimana C # / JIT berperilaku, tetapi karena saya tidak, tolong tahan dengan saya bertanya.
Saya punya kode sederhana seperti ini:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Seperti yang Anda lihat, saya meletakkan AggressiveInlining karena saya merasa seperti itu harus diuraikan.
Kupikir. Tidak ada jaminan bahwa JIT akan memberikannya sebaliknya. Apakah aku salah?
Mungkinkah melakukan hal semacam ini melukai kinerja / stabilitas / apa pun?
c#
performance
meta-programming
Serge
sumber
sumber
Jawaban:
Kompiler adalah binatang pintar. Biasanya, mereka secara otomatis akan memeras kinerja sebanyak yang mereka bisa dari mana saja.
Mencoba mengakali kompiler biasanya tidak membuat perbedaan besar, dan memiliki banyak peluang untuk menjadi bumerang. Misalnya, inlining membuat program Anda lebih besar karena duplikat kode di mana-mana. Jika fungsi Anda digunakan di banyak tempat di seluruh kode, itu mungkin sebenarnya merugikan seperti yang ditunjukkan @CodesInChaos. Jika jelas fungsi tersebut harus diuraikan, Anda dapat bertaruh kompiler akan melakukannya.
Jika ragu, Anda masih bisa melakukan keduanya dan membandingkan jika ada keuntungan kinerja, itulah satu-satunya cara untuk sekarang. Tetapi taruhan saya adalah perbedaannya akan diabaikan, kode sumber hanya akan menjadi "lebih ribut".
sumber
struct
s sebagai parameter - di mana dalam banyak kasus seharusnya dan bisa. Selain kehilangan ratusan optimasi yang jelas - termasuk, tetapi tidak terbatas pada - menghindari batas cek yang tidak perlu dan alokasi antara hal-hal lain.Anda benar - tidak ada cara untuk menjamin bahwa metode ini akan diuraikan - MSDN MethodImplOptions Enumeration , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Programmer lebih cerdas daripada kompiler, tetapi kami bekerja pada level yang lebih tinggi dan optimisasi kami adalah produk dari pekerjaan satu orang - milik kami. Jitter melihat apa yang terjadi selama eksekusi. Ia dapat menganalisis alur eksekusi dan kode sesuai dengan pengetahuan yang dimasukkan ke dalamnya oleh perancang. Anda bisa mengetahui program Anda lebih baik, tetapi mereka lebih tahu CLR. Dan siapa yang akan lebih benar dalam pengoptimalannya? Kami tidak tahu pasti.
Itu sebabnya Anda harus menguji setiap optimasi yang Anda lakukan. Bahkan jika itu sangat sederhana. Dan perhatikan bahwa lingkungan dapat berubah dan optimasi atau disoptimasi Anda dapat memiliki hasil yang sangat tak terduga.
sumber
EDIT: Saya menyadari jawaban saya tidak benar-benar menjawab pertanyaan, sementara tidak ada kelemahan nyata, dari hasil waktu saya tidak ada terbalik nyata juga. Perbedaan antara pengambil properti inline adalah 0,002 detik lebih dari 500 juta iterasi. Kasing pengujian saya mungkin juga tidak 100% akurat karena menggunakan struct karena ada beberapa peringatan terhadap jitter dan inlining dengan struct.
Seperti biasa, satu-satunya cara untuk benar-benar tahu adalah menulis tes dan mencari tahu. Ini hasil saya dengan konfigurasi sebagai berikut:
Proyek kosong dengan pengaturan berikut:
Hasil
Diuji dengan kode ini:
sumber
Compiler melakukan banyak optimasi. Salah satunya adalah inlining, apakah programmer menginginkan atau tidak. Misalnya, MethodImplOptions tidak memiliki opsi "inline". Karena inlining secara otomatis dilakukan oleh kompiler jika diperlukan.
Banyak optimasi lainnya terutama dilakukan jika diaktifkan dari opsi build, atau mode "release" akan melakukan ini. Tetapi optimasi ini adalah semacam "berhasil untuk Anda, hebat! Tidak berhasil, biarkan saja" optimasi dan biasanya memberikan kinerja yang lebih baik.
hanyalah sebuah flag untuk kompiler yang benar-benar diinginkan oleh operasi inlining. Info lebih lanjut di sini dan di sini
Untuk menjawab pertanyaan Anda;
Benar. Tidak ada jaminan; Baik C # memiliki opsi "force inlining".
Dalam hal ini tidak, seperti yang dikatakan dalam Menulis Aplikasi Terkelola Kinerja Tinggi: A Primer
sumber