Rumah >pembangunan bahagian belakang >C++ >Adakah Operator 'as' Sentiasa Menawarkan Kelebihan Prestasi berbanding 'is' untuk Jenis Nullable dalam C#?

Adakah Operator 'as' Sentiasa Menawarkan Kelebihan Prestasi berbanding 'is' untuk Jenis Nullable dalam C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-07 09:31:40240semak imbas

Does the

Kejutan Prestasi dengan Operator "as" dan Jenis Boleh Null

Dalam bab 4 C# secara Depth, jenis nullable dan operator "as" sedang dibincangkan. Secara khususnya, jangkaan ialah menggunakan "sebagai" untuk semakan jenis boleh meningkatkan prestasi berbanding semakan dan penghantaran "adalah" tradisional, kerana ia memudahkan proses kepada semakan jenis dan semakan nilai tunggal. Walau bagaimanapun, keputusan yang mengejutkan telah diperhatikan.

Ujian Penanda Aras Prestasi

Untuk menilai prestasi, ujian penanda aras telah dijalankan, yang melibatkan penjumlahan integer dalam tatasusunan objek yang merangkumi banyak rujukan nol dan rujukan rentetan . Ujian mengukur masa pelaksanaan coretan kod berikut:

  • Kod gaya 1 C# dengan "is" dan menghantar
  • Kod menggunakan "sebagai" pengendali
  • LINQ penyelesaian

Menghairankan penyelidik, kod C# 1 mengatasi kedua-dua kod "as" dan kod LINQ dengan margin yang ketara.

Analisis Keputusan

Percanggahan prestasi dikaitkan dengan perkara berikut faktor:

Pengoptimuman Pengkompil JIT untuk "is" dan Casting:
Ujian operator "is" dan lakonan seterusnya boleh dioptimumkan oleh pengkompil JIT, menghasilkan mesin yang sangat cekap kod yang dilaksanakan dalam bilangan arahan yang minimum. Pengoptimuman ini adalah mungkin kerana jenis nilai berkotak boleh dinyahkotak terus ke dalam pembolehubah jenis yang sama tanpa sebarang penukaran nilai atau penyalinan.

Kerumitan Penukaran kepada Nullable:
Mengirim ke int? menggunakan "sebagai" memerlukan proses penukaran yang lebih kompleks kerana perwakilan nilai integer berkotak berbeza daripada susun atur memori Nullable. Ini memerlukan penglibatan fungsi penolong unboxing tujuan umum yang dipanggil JIT_Unbox_Nullable, yang memperkenalkan overhed tambahan kerana sifat generik dan pemeriksaan jenisnya.

Gelagat LINQ yang Tidak Dijangka:
The OfType () kaedah sambungan dalam LINQ juga menggunakan pengendali "adalah" dan JIT_Unbox() fungsi pembantu. Walau bagaimanapun, prestasinya adalah setanding dengan pelakon "sebagai" kepada Nullable, walaupun jangkaan bahawa ia sepatutnya lebih murah. Percanggahan ini mungkin dikaitkan dengan potensi isu yang disebabkan oleh ngen.exe.

Kesimpulan

Walaupun pengendali "sebagai" menyediakan cara yang mudah untuk melakukan pemeriksaan jenis dan pengendalian nilai yang boleh dibatalkan, ciri prestasinya di bawah senario tertentu mungkin tidak selalu seperti yang diharapkan. Kod yang dioptimumkan yang dijana untuk "adalah" dan penghantaran dalam C# 1 kekal dengan ketara lebih pantas dalam kes yang melibatkan banyak operasi nyah kotak, menyerlahkan kepentingan mempertimbangkan implikasi prestasi apabila memilih teknik pengekodan.

Atas ialah kandungan terperinci Adakah Operator 'as' Sentiasa Menawarkan Kelebihan Prestasi berbanding 'is' untuk Jenis Nullable dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn