Trong Visual Basic, có sự khác biệt về hiệu suất khi sử dụng chức năng IIf
thay vì tuyên bố If
không?Hiệu suất khác biệt giữa IIf() và Nếu
Trả lời
VB có If
tuyên bố sau đó câu hỏi đề cập đến, tôi nghĩ rằng:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Đầu tiên là về cơ bản ternary nhà điều hành có điều kiện C# 's và thứ hai là của nó toán tử kết hợp (trả lại result
trừ khi đó là Nothing
, trong trường hợp này trả về "Alternative"
). Do đó, If
đã thay thế IIf
và sau đó đã lỗi thời.
Giống như trong C#, VB của điều kiện If
điều hành ngắn mạch, vì vậy bây giờ bạn có thể viết một cách an toàn sau đây, mà không phải là có thể sử dụng các IIf
chức năng:
Dim len = If(text Is Nothing, 0, text.Length)
Theo this guy, IIf có thể mất tối đa 6x miễn là Nếu/Sau đó. YMMV.
Trong tính toán thực nghiệm của tôi (10000000 chu kỳ), tôi đã đánh giá IIf chậm hơn khoảng 12 lần! –
... là tại sao nó có thể mất đến 6x, quoth wiki:
Vì IIf là một chức năng thư viện, nó sẽ luôn yêu cầu các chi phí của một cuộc gọi chức năng, trong khi đó một nhà điều hành có điều kiện sẽ có nhiều khả năng sản xuất mã số nội tuyến .
Về cơ bản IIf tương đương với toán tử bậc ba trong C++/C#, vì vậy nó cung cấp cho bạn một số câu lệnh if/else nếu bạn muốn. Bạn cũng có thể cung cấp cho nó một chức năng để đánh giá nếu bạn mong muốn.
Ngày đầu đó, khả năng đọc có lẽ sẽ được ưu tiên cao hơn hiệu suất trong trường hợp này. Ngay cả khi IIF hiệu quả hơn, nó chỉ đơn giản là ít đọc được đối tượng mục tiêu hơn (tôi giả sử nếu bạn đang làm việc trong Visual Basic, bạn muốn các lập trình viên khác có thể đọc mã của bạn một cách dễ dàng, đó là lợi ích lớn nhất của VB ... bị mất với các khái niệm như IIF theo ý kiến của tôi).
Ngoài ra, "IIF is a function, versus IF being part of the languages' syntax" ... ngụ ý rằng, thực sự, Nếu nhanh hơn ... nếu không có gì khác hơn là câu lệnh If có thể được đun sôi trực tiếp xuống một tập hợp mã nhỏ thay vì phải đi đến một không gian khác trong bộ nhớ để thực hiện logic được tìm thấy trong hàm đã nói. Đó là một sự khác biệt đáng kể, có lẽ, nhưng đáng chú ý.
IIf()
chạy cả mã đúng và sai. Đối với những thứ đơn giản như gán số, đây không phải là vấn đề lớn. Nhưng đối với mã yêu cầu bất kỳ loại xử lý nào, bạn đang lãng phí các chu kỳ chạy điều kiện không khớp, và có thể gây ra các tác dụng phụ.
Mã minh họa:
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
Đầu ra:
Foo!
Bar!
Ngoài ra, một vấn đề lớn với IIf là nó sẽ thực sự gọi bất kỳ chức năng mà là trong các đối số [1], vì vậy nếu bạn có một tình huống như sau:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Nó thực sự sẽ ném một ngoại lệ, không phải làm thế nào hầu hết mọi người nghĩ rằng chức năng hoạt động lần đầu tiên mà họ nhìn thấy nó. Điều này cũng có thể dẫn đến một số rất khó sửa lỗi trong một ứng dụng.
[1] IIf Chức năng - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Đây là lý do tại sao nếu đến để thay thế IIF cũ, tôi đã từng gặp vấn đề với IIF nhưng IF đã lưu thêm nhiều dòng mã. – NiL
Better sử dụng Nếu thay vì IIf sử dụng cơ chế suy luận kiểu một cách chính xác (Option suy luận On)
Trong ví dụ này, Từ khoá được công nhận như là một chuỗi khi tôi sử dụng Nếu:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Nếu không, nó được công nhận là một đối tượng:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Tôi tin rằng sự khác biệt chính giữa Nếu và IIf là:
Nếu (thử nghiệm [boolean], statement1, statement2) nó có nghĩa là rằng theo giá trị thử nghiệm hoặc là satement1 hoặc statement2 sẽ được thực thi (chỉ một câu lệnh sẽ được thực hiện)
Dim obj = IIF (kiểm tra [boolean], statement1, statement2) nó có nghĩa là cả hai câu lệnh sẽ thực thi nhưng theo giá trị thử nghiệm, một trong số chúng sẽ trả về một giá trị (obj).
vì vậy nếu một trong các câu lệnh sẽ ném ngoại lệ, nó sẽ ném vào (IIf), nhưng trong (If) nó sẽ ném nó trong trường hợp điều kiện sẽ trả về giá trị của nó.
Các chức năng này khác nhau! Có lẽ bạn chỉ cần sử dụng câu lệnh IF. IIF sẽ luôn chậm hơn, bởi vì nó sẽ thực hiện cả hai chức năng cộng với nó sẽ làm câu lệnh IF chuẩn.
Nếu bạn đang tự hỏi tại sao có IIF chức năng, có lẽ đây sẽ là lời giải thích:
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
Vì vậy, bộ đếm sẽ được 2 sau này, nhưng s sẽ là "YES" mà thôi. Tôi biết công cụ truy cập này là vô ích, nhưng đôi khi có những chức năng mà bạn sẽ cần cả hai để chạy, không quan trọng nếu IF là đúng hay sai, và chỉ gán giá trị từ một trong số chúng cho biến của bạn.
nếu bạn cần cả hai để chạy, bạn nên rõ ràng gọi cho cả hai và sau đó làm một tiêu chuẩn Nếu. Sử dụng 'IIf()' theo cách này sẽ gây nhầm lẫn cho người đọc mã của bạn. – Spivonious
Tôi biết điều đó, nhưng câu hỏi là về sự khác biệt giữa hai điều đó. – titol
Tôi đã không có ý kiến cho các bình luận để đi qua như là một lời chỉ trích; Tôi đã chỉ ra rằng sử dụng nó theo cách này không phải là một thực hành tốt. – Spivonious
Thiên Chúa của tôi, chỉnh sửa đánh giá hoàn toàn vô dụng. Một biên tập viên vô danh đề xuất một bản chỉnh sửa mà sau đó đã bị từ chối bởi ba người đánh giá, mặc dù nó đã sửa * một lỗi trong mã của tôi. Nếu bạn đọc điều này và bạn nằm trong số những người đánh giá này: bạn sẽ cảm thấy xấu! –
Bạn không trả lời câu hỏi về hiệu suất và cũng không đề cập đến các tác dụng phụ của 'IIf'. – jor
@jor Đoạn cuối cùng của câu trả lời của tôi là về các tác dụng phụ. Hiệu suất không thực sự có liên quan khi một trong các tùy chọn đã lỗi thời. Đối với giá trị của nó, toán tử 'If' hiệu quả hơn hàm' IIf' cho đến nay. –