Edit:
Menambahkan contoh yang bisa dilakukan dengan pernyataan if-else tetapi bukan operator kondisional.
Sebelum jawabannya, silakan lihat [ Mana yang lebih cepat? ] di blog Mr. Lippert. Dan saya pikir jawaban Mr. Ersönmez adalah yang paling benar di sini.
Saya mencoba menyebutkan sesuatu yang harus kita ingat dengan bahasa pemrograman tingkat tinggi.
Pertama, saya tidak pernah mendengar bahwa operator kondisional seharusnya lebih cepat atau kinerja yang sama dengan pernyataan if-else di C♯ .
Alasannya sederhana bahwa bagaimana jika tidak ada operasi dengan pernyataan if-else:
if (i > 0)
{
value += 2;
}
else
{
}
Persyaratan operator bersyarat adalah harus ada nilai dengan kedua sisi, dan di C♯ juga mensyaratkan bahwa kedua sisi :
memiliki tipe yang sama. Ini hanya membuatnya berbeda dari pernyataan if-else. Dengan demikian pertanyaan Anda menjadi pertanyaan yang menanyakan bagaimana instruksi kode mesin dihasilkan sehingga perbedaan kinerja.
Dengan operator kondisional, semantiknya adalah:
Apa pun ekspresi yang dievaluasi, ada nilainya.
Tetapi dengan pernyataan if-else:
Jika ekspresi dievaluasi benar, lakukan sesuatu; jika tidak, lakukan hal lain.
Nilai tidak harus terlibat dengan pernyataan if-else. Asumsi Anda hanya mungkin dengan optimasi.
Contoh lain untuk menunjukkan perbedaan di antara mereka adalah seperti berikut:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
if(i>0)
array1[1]=4;
else
array2[2]=4;
kode di atas mengkompilasi, namun, ganti pernyataan if-else dengan operator kondisional tidak akan dikompilasi:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
(i>0?array1[1]:array2[2])=4; // incorrect usage
Operator bersyarat dan pernyataan if-else secara konseptual sama ketika Anda melakukan hal yang sama, mungkin bahkan lebih cepat dengan operator bersyarat di C , karena C lebih dekat dengan perakitan platform.
Untuk kode asli yang Anda berikan, operator kondisional digunakan dalam foreach-loop, yang akan mengacaukan segalanya untuk melihat perbedaan di antara mereka. Jadi saya mengusulkan kode berikut:
public static class TestClass {
public static void TestConditionalOperator(int i) {
long value=0;
value+=i>0?2:3;
}
public static void TestIfElse(int i) {
long value=0;
if(i>0) {
value+=2;
}
else {
value+=3;
}
}
public static void TestMethod() {
TestConditionalOperator(0);
TestIfElse(0);
}
}
dan berikut ini adalah dua versi IL yang dioptimalkan dan tidak. Karena panjang, saya menggunakan gambar untuk ditampilkan, sisi kanan adalah yang dioptimalkan:
(Klik untuk melihat gambar ukuran penuh.)
Dalam kedua versi kode, IL dari operator bersyarat terlihat lebih pendek dari pernyataan if-else, dan masih ada keraguan tentang kode mesin yang akhirnya dihasilkan. Berikut ini adalah petunjuk dari kedua metode ini, dan gambar sebelumnya tidak dioptimalkan, yang terakhir adalah yang dioptimalkan:
Dalam yang terakhir, blok kuning adalah kode yang hanya dieksekusi jika i<=0
, dan blok biru adalah kapan i>0
. Dalam kedua versi instruksi, pernyataan if-else lebih pendek.
Perhatikan bahwa, untuk instruksi yang berbeda, [ CPI ] tidak harus sama. Secara logis, untuk instruksi yang sama, lebih banyak instruksi membutuhkan siklus yang lebih lama. Tetapi jika instruksi mengambil waktu dan pipa / cache juga diperhitungkan, maka total waktu pelaksanaan sebenarnya tergantung pada prosesor. Prosesor juga dapat memprediksi cabang.
Prosesor modern bahkan memiliki lebih banyak inti, hal-hal dapat menjadi lebih kompleks dengan itu. Jika Anda adalah pengguna prosesor Intel, Anda mungkin ingin melihat [ Intel® 64 and IA-32 Architectures Reference Reference Manual ].
Saya tidak tahu apakah ada CLR yang diimplementasikan perangkat keras, tetapi jika ya, Anda mungkin lebih cepat dengan operator kondisional karena IL jelas lebih rendah.
Catatan: Semua kode mesin adalah x86.
DateTime
untuk mengukur kinerja. GunakanStopwatch
. Selanjutnya, waktu yang agak lama - itu waktu yang sangat singkat untuk diukur.