Perbezaan Prestasi Tidak Dijangka dengan Operator "as" dan Jenis Nullable dalam C#
Operator "as" dalam C# menyediakan cara yang mudah untuk dilakukan taip semak dan hantaran secara dinamik. Walaupun nampaknya menggunakan "sebagai" dengan jenis boleh batal akan menawarkan peningkatan prestasi berbanding pengendali dan penghantaran "adalah" tradisional, ujian baru-baru ini telah mendedahkan keputusan yang mengejutkan.
Dalam senario ujian di mana tatasusunan objek mengandungi campuran daripada integer, rentetan dan rujukan nol, pengendali "sebagai" jauh lebih rendah prestasinya berbanding dengan pengendali "adalah". Ini adalah tidak dijangka, kerana seseorang akan menganggap bahawa gabungan pengendali "sebagai" semakan jenis dan semakan nilai akan menjadi lebih cekap daripada menanyakan jenis dinamik dua kali.
Menganalisis pelaksanaan .NET bagi "isinst" untuk jenis nullable mendedahkan bahawa ia tidak terlalu perlahan. Sebaliknya, isu ini nampaknya berpunca daripada langkah penyahkotak tambahan yang diperlukan apabila menggunakan "sebagai" dengan jenis yang boleh dibatalkan.
Pengkompil JIT boleh menjana kod yang sangat dioptimumkan untuk pengendali "adalah" dan menghantar untuk jenis yang tidak boleh dibatalkan. Walau bagaimanapun, "as" dengan jenis nullable memerlukan fungsi pembantu JIT yang lebih kompleks untuk melaksanakan penyahkotak dan penukaran kepada Nullable
Penyelesaian LINQ, yang menggunakan "OfType()" dan hantaran kepada jenis generik, juga berprestasi lebih teruk daripada pengendali "adalah". Ini boleh dikaitkan dengan fungsi pembantu JIT, JIT_Unbox(), yang dipanggil semasa penghantaran ke Nullable
Kesimpulannya, sementara operator "as" menyediakan sintaks yang mudah, ia mungkin tidak selalu menawarkan prestasi terbaik apabila bekerja dengan jenis nullable. Dalam senario kritikal prestasi, adalah dinasihatkan untuk menggunakan pengendali "adalah" dan hantaran terus kepada jenis yang diingini.
Atas ialah kandungan terperinci Mengapa pengendali C# 'as' lebih perlahan daripada 'is' dengan jenis nullable?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!