VB.NET中IIF和IF使用效率分析

一、问题描述

熟悉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 ...”来得简单啊!

所以,这个限制这个方法效率的就是这个类型的转换。

三、总结

总结一下,在程序逻辑比较简单,对性能要求不高的时候可以随意替换。但是当程序在发展的过程中逐渐变的庞大,逻辑越来越复杂的时候就会有影响了,但是到那时可能就没时间再去整理这些旁支末节却又影响深远的东西了。


[转]http://blog.csdn.net/ghjlesse/article/details/6952034

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值