Kejutan Prestasi dengan "as" dan Jenis Boleh Null
Latar Belakang
The "as" operator dalam C# membenarkan pemeriksaan jenis dinamik dan penghantaran selamat. Ini berpotensi meningkatkan prestasi berbanding pengendali "adalah" tradisional diikuti oleh pelakon. Walau bagaimanapun, keputusan prestasi yang tidak dijangka telah diperhatikan dalam kes ujian baru-baru ini.
Apl dan Keputusan Ujian
Apl ujian telah dibangunkan untuk menjumlahkan integer daripada tatasusunan objek yang mengandungi rujukan nol , rujukan rentetan dan integer berkotak. Apl ini menggunakan tiga pendekatan: "Hantar" (setara C# 1), "Sebagai" (menggunakan pengendali "sebagai") dan "LINQ" (menggunakan kaedah sambungan OfType()). Yang menghairankan, pendekatan "Cast" adalah jauh lebih pantas daripada pendekatan "As", yang seterusnya lebih perlahan sedikit daripada pendekatan "LINQ".
Analisis
Analisis Pengkompil JIT boleh menjana kod yang sangat cekap untuk pendekatan "Hantar" kerana ia menggunakan penukaran nilai dalam memori. Objek hanya boleh dinyahkotak kepada pembolehubah dengan jenis yang sama seperti nilai kotak, yang memudahkan proses pemutus.
Pendekatan "As" memerlukan penukaran kepada Nullable
Pendekatan "LINQ" menggunakan pengendali "adalah" dan cast generik melalui fungsi pembantu JIT_Unbox(). Walaupun prestasinya lebih baik sedikit daripada pendekatan "As", ia masih lebih perlahan disebabkan oleh pengoptimuman ngen.exe.
Kesimpulan
Pengendali "as" mungkin tidak selalunya memberikan faedah prestasi berbanding pendekatan "Hantar", terutamanya dalam situasi sensitif prestasi. Walaupun pendekatan "LINQ" adalah alternatif yang berdaya maju, ia juga mungkin menghadapi had prestasi. Oleh itu, adalah penting untuk mempertimbangkan konteks khusus dan mempertimbangkan pertukaran sebelum memilih pendekatan yang optimum.
Atas ialah kandungan terperinci Mengapakah Operator 'sebagai' C# Lebih Lambat Daripada Casting Tradisional dalam Ujian Penjumlahan Integer Boleh Null ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!