VB.NET中IIF和IF使用效率分析
2011-11-09 14:59
302 查看
一、问题描述
熟悉C/C++、C#或者Java的“*工”们,都知道存在那么个三目运算符“?:"。这个三目运算符在某种情况下可以视作精简版的"if ... else...".
例如:
如果使用”?:“三目运算符后,可以用如下的方式:
so,原来的四行代码现在变成一行了,减少了代码的编写量又不影响对逻辑的理解,发明这个运算符的前辈应该是喜欢偷懒的,嘿嘿!
前不久,加入到一个VB的项目中,开始接触VB了,发现整个VB源代码像是一篇简化版的英文文章!
言归正传,VB中没有了三目运算符”?:",取而代之的是“IIf”这玩意儿。于是我就想,逻辑比较简单的“If ... Else ..."是否可以用"IIf"替换呢?
那么最简单的就是测试它们两个的性能,代码如下:
so,这个进化版,不对,确切说是由"?:"退化而成的"IIf()"的性能的确不怎么地啊。
当然,逻辑比较简单,循环次数不多的时候这些性能的损失还是可以容忍的,是吧!
那么,为什么会有这样的差别呢?
二、问题剖析
我们先来看看IIf()这个方法的官方说明吧:
Expression
必选。Boolean。要计算的表达式。
TruePart
必选。Object。Expression 计算结果等于 True
时返回。
FalsePart
必选。Object。Expression 计算结果等于 False
时返回。
哦,原来是这样啊,这个方法的第二、三个形参的类型都是鼎鼎大名的Object啊,我只是想要个String类型的返回值,你却给我一个Object,我还得转换,太麻烦了,远没有“If ... Else ...”来得简单啊!
所以,这个限制这个方法效率的就是这个类型的转换。
三、总结
总结一下,在程序逻辑比较简单,对性能要求不高的时候可以随意替换。但是当程序在发展的过程中逐渐变的庞大,逻辑越来越复杂的时候就会有影响了,但是到那时可能就没时间再去整理这些旁支末节却又影响深远的东西了。
熟悉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"所以,英文好的,学习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 ...”来得简单啊!
所以,这个限制这个方法效率的就是这个类型的转换。
三、总结
总结一下,在程序逻辑比较简单,对性能要求不高的时候可以随意替换。但是当程序在发展的过程中逐渐变的庞大,逻辑越来越复杂的时候就会有影响了,但是到那时可能就没时间再去整理这些旁支末节却又影响深远的东西了。
相关文章推荐
- VB.NET中IIF和IF使用效率分析
- VB.NET中IF与IIF的区别
- 从VB.Net到VB6.0要小心,关于使用IIF和log求对数函数(串联的小知识)
- VB.net使用多线程与委托解决时间延迟的问题
- C++之STL(五):非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)
- vb.net配置文件的使用
- 如何使用NET Reactor为您的.Net(C#,VB.Net) 源代码加密!
- ASP.Net中使用VB.Net调用存储过程并得到返回值
- vb.net中使用GetPrivateProfileString访问INI文件,解决中文路径问题
- 在VB.NET中如何使用多线程详细知识
- 如何使用C#或者VB.NET读写Access数据库的标题(Caption)、描述(Description)等字段信息?
- netif_rx_schedule函数自Linux-2.6.30开始不再使用
- 使用vb.net实现五子棋的人工智能五子棋的AI构想
- asp.net Forms表单验证 使用经验及验证流程分析
- vb.net 2005 类事件的使用
- VB.NET中使用FTP下载文件的两种方法
- N-Tiers开发方式(如何使用VB.NET撰写COM+组件)
- [原创]VB.net技巧之七----asp.net中cookie的使用
- [VB.NET]使用PopupControlExtender 弹出窗口返回Web Service call failed: 500.
- vb.net开发中使用excel插件学习