Dalam Visual Basic, apakah ada perbedaan kinerja saat menggunakan IIf
fungsi daripada If
pernyataan?
Dalam Visual Basic, apakah ada perbedaan kinerja saat menggunakan IIf
fungsi daripada If
pernyataan?
Jawaban:
VB memiliki If
pernyataan 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 ( result
kecuali jika itu Nothing
, dalam hal ini kembali "Alternative"
). If
dengan demikian diganti IIf
dan yang terakhir sudah usang.
Seperti di C #, If
sirkuit pendek operator bersyarat VB , jadi Anda sekarang dapat dengan aman menulis yang berikut, yang tidak mungkin menggunakan IIf
fungsi:
Dim len = If(text Is Nothing, 0, text.Length)
If
lebih efisien daripada IIf
fungsinya sejauh ini.
That's all you need to know, really
tidak terdengar seperti sikap yang kondusif untuk situs web yang didedikasikan untuk berbagi pengetahuan;)
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!
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
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)
Menurut orang ini , IIf bisa memakan waktu hingga 6x selama If / Then. YMMV.
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.
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.
... 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.
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.
IIf()
cara ini hanya akan membingungkan orang yang membaca kode Anda.
IIf
.