IIf () ve If arasındaki performans farkı


Yanıtlar:


140

VB'nin Ifsorunun atıfta bulunduğu şu ifadeye sahip olduğunu düşünüyorum:

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

Birincisi temelde C # 'ın üçlü koşullu operatörü ve ikincisi onun birleştirme operatörüdür ( resultolmadığı sürece geri dön Nothing, bu durumda dönüş "Alternative"). Ifbu nedenle değiştirilmiştir IIfve ikincisi artık kullanılmamaktadır.

C #, VB'nin koşullu Ifoperatör kısa devrelerinde olduğu gibi, artık aşağıdakileri güvenle yazabilirsiniz, bu IIfişlevi kullanarak mümkün değildir :

Dim len = If(text Is Nothing, 0, text.Length)

3
Performans sorusuna cevap vermediniz ve ayrıca yan etkilerinden de bahsetmediniz IIf.
jor

2
@jor Cevabımın son paragrafı yan etkilerle ilgili. Seçeneklerden biri kullanılmadığında performans gerçekten alakalı değildir. Değeri ne olursa olsun, yerel operatör işlevden Ifaçık ara daha verimlidir IIf.
Konrad Rudolph

2
@mmcrae Bu doğru ve kasıtlı: Dediğim gibi, IIf modası geçmiş, bu yüzden bunu tartışmanın pek bir anlamı yok. Bununla birlikte, son paragrafım konuyla ilgili farkı tartışıyor. Bilmen gereken tek şey bu, gerçekten.
Konrad Rudolph

2
İyi standartları desteklemek ve yeni başlayanların kötü uygulamaları benimsememesini sağlamak istediğinizi takdir ediyorum, ancak birisinin farkı daha iyi anlamak istemesine neden olan tamamen meşru bir sorunu olabilir ... Eski kodu korumak, takılıp kalmak gibi onu kullanan başka bir araç vb. Ve That's all you need to know, reallybilgi paylaşımına adanmış bir web sitesi için elverişli bir tutum gibi gelmiyor;)
Don Cheadle

1
@mmcrae Oh, küçümsemek istemedim, sadece gerçekten IIf'nin içindekilerin sıkıcı bir şekilde önemsiz olduğunu söyledim. Basitçe, cevabımdaki son kod parçasının çalışmayacağını ima eden geleneksel bir If ifadesi içerir.
Konrad Rudolph

65

IIf()hem doğru hem de yanlış kodu çalıştırır. Sayısal atama gibi basit şeyler için bu çok önemli değil. Ancak herhangi bir işlem gerektiren kod için, eşleşmeyen koşulu çalıştıran ve muhtemelen yan etkilere neden olan döngüleri boşa harcıyorsunuz.

Kod çizimi:

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

Çıktılar:

Foo!
Bar!

13

Ayrıca, IIf ile ilgili bir başka büyük sorun da, [1] bağımsız değişkenlerinde bulunan herhangi bir işlevi gerçekten çağıracak olmasıdır, bu nedenle aşağıdaki gibi bir durumunuz varsa:

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

Aslında bir istisna yaratacaktır, çoğu insan işlevi ilk gördüklerinde böyle çalıştığını düşünmez. Bu aynı zamanda bir uygulamadaki bazı hataları düzeltmek için çok zor olabilir.

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


Bu yüzden eski IIF'yi değiştirmeye gelirsem, IIF ile ilgili sorunlar yaşıyordum, ancak IF birçok satır kod eklemekten kurtuldu.
NiL

7

Tür çıkarım mekanizmasını doğru kullanmak için IIf yerine If kullan daha iyi (Option Infer On)

Bu örnekte, Anahtar Kelimeler If kullandığımda bir dize olarak tanınır:

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

Aksi takdirde, bir Nesne olarak tanınır:

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

6

Bu adama göre , IIf If / Then kadar 6 kat daha uzun sürebilir. YMMV.


1
Ampirik hesaplamalarımda (10000000 döngü), IIf'nin yaklaşık 12 kat daha yavaş olduğunu değerlendirdim!
Phantômaxx

6

Bunun da ötesinde, bu durumda okunabilirlik muhtemelen performanstan daha çok tercih edilmelidir. IIF daha verimli olsa bile, hedef kitle tarafından daha az okunabilir (Visual Basic'te çalışıyorsanız, diğer programcıların kodunuzu kolayca okuyabilmesini istersiniz ki bu VB'nin en büyük nimetidir ... ve bence IIF gibi kavramlarla kayboldu).

Ayrıca, "IF, dillerin sözdiziminin bir parçası olmasına karşın IIF bir işlevdir" ... ki bu bana şunu ima ediyor: Gerçekten daha hızlı olurdu ... eğer bundan başka bir şey olmasa bile, If ifadesi doğrudan kısaltılabilir. söz konusu işlevde bulunan mantığı gerçekleştirmek için bellekte başka bir alana gitmek zorunda kalmak yerine küçük bir işlem kodu kümesine. Bu basmakalıp bir farklılık olabilir, ama kayda değer.


6

If ve IIf arasındaki temel farkın şudur:

  • (Test [boolean], ifade1, ifade2) ise bu, test değerine göre satement1 veya ifade2'nin çalıştırılacağı anlamına gelir (sadece bir ifade yürütülecektir)

  • Dim obj = IIF (test [boolean], ifade1, ifade2) her iki ifadenin de çalışacağı, ancak test değerine göre bunlardan birinin (obj) değerine döneceği anlamına gelir.

yani ifadelerden biri bir istisna atarsa, yine de onu (IIf) 'ye atar, ancak (If)' de koşulun değerini döndürmesi durumunda onu atar.


5

... neden 6x kadar uzun sürebileceğine gelince, wiki:

IIf bir kütüphane işlevi olduğundan, her zaman bir işlev çağrısının ek yükünü gerektirecektir, oysa bir koşullu operatör büyük olasılıkla satır içi kod üretecektir.

Esasen IIf, C ++ / C # 'daki üçlü bir operatörün eşdeğeridir, bu nedenle, isterseniz size güzel 1 satır if / else tip ifadeleri verir. İsterseniz değerlendirmek için bir işlev de verebilirsiniz.


1

Bu işlevler farklı! Belki de sadece IF ifadesini kullanmanız gerekir. IIF her zaman daha yavaş olacaktır, çünkü her iki işlevi de yerine getirecek ve standart IF deyimini gerçekleştirecektir.

Neden IIF işlevi olduğunu merak ediyorsanız, belki bu açıklama olabilir:

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

Dolayısıyla sayaç bundan sonra 2 olacak, ancak s yalnızca "EVET" olacaktır. Bu sayacın işe yaramaz olduğunu biliyorum, ancak bazen her ikisini de çalıştırmanız gereken işlevler vardır, IF'nin doğru veya yanlış olması fark etmez ve bunlardan birinden değişkeninize değer atayın.


her ikisinin de çalışması gerekiyorsa, ikisini de açıkça çağırmalı ve ardından standart bir If yapmalısınız. IIf()Bu şekilde kullanmak , kodunuzu okuyan insanların kafasını karıştıracaktır.
Spivonious

Yorumun bir eleştiri olarak karşımıza çıkmasını istemedim; Bunu bu şekilde kullanmanın iyi bir uygulama olmadığını söylüyordum.
Spivonious
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.