Perbedaan performa antara IIf () dan If

98

Dalam Visual Basic, apakah ada perbedaan kinerja saat menggunakan IIffungsi daripada Ifpernyataan?

Bryan Roth
sumber

Jawaban:

140

VB memiliki Ifpernyataan berikut yang merujuk pada pertanyaan tersebut, saya pikir:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

Yang pertama pada dasarnya adalah operator kondisional terner C # dan yang kedua adalah operator penggabungannya ( resultkecuali jika itu Nothing, dalam hal ini kembali "Alternative"). Ifdengan demikian diganti IIfdan yang terakhir sudah usang.

Seperti di C #, Ifsirkuit pendek operator bersyarat VB , jadi Anda sekarang dapat dengan aman menulis yang berikut, yang tidak mungkin menggunakan IIffungsi:

Dim len = If(text Is Nothing, 0, text.Length)
Konrad Rudolph
sumber
2
Anda tidak menjawab pertanyaan kinerja dan juga tidak menyebutkan efek sampingnya IIf.
jor
2
@jor Paragraf terakhir dari jawaban saya adalah tentang efek samping. Performa tidak terlalu relevan jika salah satu opsi sudah usang. Untuk apa nilainya, operator asli Iflebih efisien daripada IIffungsinya sejauh ini.
Konrad Rudolph
2
@mmcrae Itu benar dan sengaja: seperti yang saya katakan, IIf sudah usang, jadi tidak ada gunanya membahasnya. Meskipun demikian, paragraf terakhir saya memang membahas perbedaan yang relevan. Itu saja yang perlu Anda ketahui, sungguh.
Konrad Rudolph
2
Saya menghargai Anda ingin mendukung standar yang baik dan memastikan pemula tidak mengambil praktik buruk, tetapi seseorang mungkin memiliki masalah sah yang menyebabkan mereka ingin memahami perbedaannya dengan lebih baik ... Seperti mempertahankan kode warisan, terjebak dengan beberapa alat lain yang menggunakannya, dll. Dan That's all you need to know, reallytidak terdengar seperti sikap yang kondusif untuk situs web yang didedikasikan untuk berbagi pengetahuan;)
Don Cheadle
1
@mmcrae Oh, saya tidak bermaksud meremehkan, saya hanya bermaksud bahwa internal IIf membosankan sepele. Ini hanya berisi pernyataan If konvensional, yang menyiratkan bahwa potongan kode terakhir dalam jawaban saya tidak akan berjalan.
Konrad Rudolph
65

IIf()menjalankan kode benar dan salah. Untuk hal-hal sederhana seperti penugasan numerik, ini bukan masalah besar. Tetapi untuk kode yang memerlukan pemrosesan apa pun, Anda membuang-buang siklus menjalankan kondisi yang tidak cocok, dan mungkin menyebabkan efek samping.

Ilustrasi kode:

Module Module1
    Sub Main()
        Dim test As Boolean = False
        Dim result As String = IIf(test, Foo(), Bar())
    End Sub

    Public Function Foo() As String
        Console.WriteLine("Foo!")
        Return "Foo"
    End Function

    Public Function Bar() As String
        Console.WriteLine("Bar!")
        Return "Bar"
    End Function
End Module

Keluaran:

Foo!
Bar!
Thomas G. Mayfield
sumber
13

Selain itu, masalah besar lainnya dengan IIf adalah ia akan benar-benar memanggil fungsi apa pun yang ada dalam argumen [1], jadi jika Anda mengalami situasi seperti berikut:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

Ini sebenarnya akan memunculkan pengecualian, yang bukan merupakan cara kerja sebagian besar orang saat pertama kali melihatnya. Ini juga dapat menyebabkan beberapa bug yang sangat sulit diperbaiki dalam suatu aplikasi juga.

[1] Fungsi IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

rjzii
sumber
Inilah sebabnya mengapa jika datang untuk menggantikan IIF lama, saya dulu memiliki masalah dengan IIF tetapi JIKA disimpan menambahkan banyak baris kode.
NiL
7

Lebih baik gunakan If daripada IIf untuk menggunakan mekanisme inferensi tipe dengan benar (Option Infer On)

Dalam contoh ini, Kata kunci dikenali sebagai string saat saya menggunakan If:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

Jika tidak, itu dikenali sebagai Objek:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Larry
sumber
6

Menurut orang ini , IIf bisa memakan waktu hingga 6x selama If / Then. YMMV.

Greg Hurlman
sumber
1
Dalam perhitungan empiris saya (10.000.000 siklus), saya menilai IIf sekitar 12x lebih lambat!
Phantômaxx
6

Selain itu, keterbacaan mungkin lebih disukai daripada kinerja dalam kasus ini. Bahkan jika IIF lebih efisien, itu hanya kurang dapat dibaca oleh target audiens (saya asumsikan jika Anda bekerja di Visual Basic, Anda ingin programmer lain dapat membaca kode Anda dengan mudah, yang merupakan keuntungan terbesar VB ... dan yang kalah dengan konsep seperti IIF menurut saya).

Juga, "IIF adalah fungsi, versus IF menjadi bagian dari sintaks bahasa" ... yang menyiratkan kepada saya bahwa, memang, Jika akan lebih cepat ... jika tidak ada yang lain selain itu pernyataan If dapat diringkas secara langsung ke satu set kecil opcode daripada harus pergi ke ruang lain dalam memori untuk melakukan logika yang ditemukan dalam fungsi tersebut. Ini perbedaan basi, mungkin, tapi perlu diperhatikan.

EdgarVerona
sumber
6

Saya percaya bahwa perbedaan utama antara If dan IIf adalah:

  • Jika (test [boolean], pernyataan1, pernyataan2) itu berarti bahwa menurut nilai pengujian baik satement1 atau pernyataan2 akan dieksekusi (hanya satu pernyataan yang akan dieksekusi)

  • Dim obj = IIF (test [boolean], statement1, statement2) artinya kedua statement akan dieksekusi tetapi menurut nilai test salah satunya akan mengembalikan nilai menjadi (obj).

jadi jika salah satu pernyataan akan menampilkan pengecualian, ia akan tetap memasukkannya ke dalam (IIf) tetapi di (Jika) ia akan membuangnya jika kondisi akan mengembalikan nilainya.

beberapa pria
sumber
5

... mengapa bisa memakan waktu hingga 6x, kata wiki:

Karena IIf adalah fungsi pustaka, ini akan selalu membutuhkan overhead pemanggilan fungsi, sedangkan operator bersyarat kemungkinan besar akan menghasilkan kode inline.

Pada dasarnya IIf adalah ekuivalen dengan operator terner di C ++ / C #, jadi ini memberi Anda beberapa pernyataan tipe 1 baris if / else yang bagus jika Anda menginginkannya. Anda juga dapat memberinya fungsi untuk mengevaluasi jika Anda menginginkannya.

Dillie-O
sumber
1

Fungsi itu berbeda! Mungkin Anda hanya perlu menggunakan pernyataan IF. IIF akan selalu lebih lambat, karena IIF akan melakukan kedua fungsi plus akan melakukan pernyataan IF standar.

Jika Anda bertanya-tanya mengapa ada fungsi IIF, mungkin ini penjelasannya:

Sub main()
    counter = 0
    bln = True
    s = iif(bln, f1, f2)
End Sub

Function f1 As String
    counter = counter + 1
    Return "YES"
End Function

Function f2 As String
    counter = counter + 1
    Return "NO"
End Function

Jadi penghitung akan menjadi 2 setelah ini, tetapi s hanya akan menjadi "YA". Saya tahu hal-hal penghitung ini tidak berguna, tetapi terkadang ada fungsi yang Anda perlukan keduanya untuk dijalankan, tidak masalah jika IF benar atau salah, dan cukup tetapkan nilai dari salah satunya ke variabel Anda.

titol
sumber
jika Anda membutuhkan keduanya untuk dijalankan, Anda harus secara eksplisit memanggil keduanya dan kemudian melakukan If standar. Menggunakan IIf()cara ini hanya akan membingungkan orang yang membaca kode Anda.
Spivonious
Saya tahu itu, tapi pertanyaannya adalah tentang perbedaan antara keduanya.
titol
Saya tidak bermaksud agar komentar tersebut dianggap sebagai kritik; Saya baru saja menunjukkan bahwa menggunakannya dengan cara ini bukanlah praktik yang baik.
Spivonious