一、问题描述
熟悉C/C++、C#或者Java的“*工”们,都知道存在那么个三目运算符“?:"。这个三目运算符在某种情况下可以视作精简版的"if ... else...".
例如:
if(strTemp=="Test")
strTemp="Yes";
else
strTemp="No";
如果使用” ?: “三目运算符后,可以用如下的方式:
strTemp=strTemp=="Test"?"Yes":"No";
so,原来的四行代码现在变成一行了,减少了代码的编写量又不影响对逻辑的理解,发明这个运算符的前辈应该是喜欢偷懒的,嘿嘿!
前不久,加入到一个VB的项目中,开始接触VB了,发现整个VB源代码像是一篇简化版的英文文章!
If strTemp="Test" Then
strTemp="Yes"
Else
strTemp="No"
End If
所以,英文好的,学习VB的效率会很高!
言归正传,VB中没有了三目运算符”?:",取而代之的是“IIf”这玩意儿。于是我就想,逻辑比较简单的“If ... Else ..."是否可以用"IIf"替换呢?
那么最简单的就是测试它们两个的性能,代码如下:
Private Sub IIfandIfTest()
Dim strTest As String = "test"
Dim blnTestResult As Boolean = False
Console.WriteLine(op_format, "Cycles", count)
Dim sw As Stopwatch = Stopwatch.StartNew()
For i As Int32 = 0 To count
blnTestResult = IIf(strTest.Length = 0, True, False)
Next
Console.WriteLine(op_format, "IIF() Method", sw.Elapsed)
sw = Stopwatch.StartNew()
For i As Int32 = 0 To count
If strTest.Length = 0 Then blnTestResult = True Else blnTestResult = False
Next
Console.WriteLine(op_format, "If Method", sw.Elapsed)
End Sub
结果呢?
so,这个进化版,不对,确切说是由"?:"退化而成的"IIf()"的性能的确不怎么地啊。
当然,逻辑比较简单,循环次数不多的时候这些性能的损失还是可以容忍的,是吧!
那么,为什么会有这样的差别呢?
二、问题剖析
我们先来看看IIf()这个方法的官方说明吧:
Public Function IIf( _
ByVal Expression As Boolean, _
ByVal TruePart As Object, _
ByVal FalsePart As Object _
) As Object
参数
Expression
必选。 Boolean 。要计算的表达式。
TruePart
必选。 Object 。 Expression 计算结果等于 True 时返回。
FalsePart
必选。 Object 。 Expression 计算结果等于 False 时返回。
哦,原来是这样啊,这个方法的第二、三个形参的类型都是鼎鼎大名的Object啊,我只是想要个String类型的返回值,你却给我一个Object,我还得转换,太麻烦了,远没有“If ... Else ...”来得简单啊!
所以,这个限制这个方法效率的就是这个类型的转换。
三、总结
总结一下,在程序逻辑比较简单,对性能要求不高的时候可以随意替换。但是当程序在发展的过程中逐渐变的庞大,逻辑越来越复杂的时候就会有影响了,但是到那时可能就没时间再去整理这些旁支末节却又影响深远的东西了。