Module Module1
Sub Main()
Dim i As Integer =
Dim s1 As String = "我是真的"
Dim s2 As String = "我不是真的"
Dim s3 As String
Dim mx As Integer =
Dim start As DateTime For iii As Integer = To
start = DateTime.Now
For ii As Integer = To mx
If i = Then
s3 = s1
Else
s3 = s2
End If
Next
Console.WriteLine((DateTime.Now - start).TotalMilliseconds) start = DateTime.Now
For ii As Integer = To mx
s3 = If(i = , s1, s2)
Next
Console.WriteLine((DateTime.Now - start).TotalMilliseconds) start = DateTime.Now
For ii As Integer = To mx
s3 = IIf(i = , s1, s2)
Next
Console.WriteLine((DateTime.Now - start).TotalMilliseconds) Console.WriteLine("--------------------------------")
Next
End Sub
End Module

执行结果:

2628.1503
2377.1359
6495.3716
--------------------------------
2602.1488
2390.1367
6535.3738
--------------------------------
2579.1475
2414.1381
6532.3736
--------------------------------
2651.1516
2405.1376
6627.3791
--------------------------------
2641.151
2390.1367
6538.374
--------------------------------
2619.1498
2398.1371
6656.3807
--------------------------------
2716.1554
2441.1396
6574.3761
--------------------------------
2623.15
2451.1402
6618.3786
--------------------------------
2650.1516
2409.1378
6550.3747
--------------------------------
2669.1527
2425.1387
6683.3823
--------------------------------

看结果很明显,效率上:If-Else 略大于 If(Express,SelectValue1,SelectValue2) 大于 IIf(Express,SelectValue1,SelectValue2)

这是为什么呢?

先看全部的IL(当然也可以略去不看,下面我已经将重要片段给截取出来做了比较,提示:本题中大部分指令已在本文结尾处做了注释)

 --- D:\Moontest\ConsoleApplication1\Module1.vb ---------------------------------
Dim i As Integer =
push ebp
mov ebp,esp
push edi
push esi
sub esp,108h
0000000b lea edi,[ebp+FFFFFEF0h]
mov ecx,40h
xor eax,eax
rep stos dword ptr es:[edi]
0000001a cmp dword ptr ds:[004B1538h],
je
call 682F477C
xor edx,edx
0000002a mov dword ptr [ebp+FFFFFF00h],edx
xor edx,edx
mov dword ptr [ebp+FFFFFF04h],edx
xor edx,edx
0000003a mov dword ptr [ebp+FFFFFEFCh],edx
xor edx,edx
mov dword ptr [ebp-10h],edx
xor edx,edx
mov dword ptr [ebp-0Ch],edx
0000004a xor edx,edx
0000004c mov dword ptr [ebp-24h],edx
0000004f xor edx,edx
mov dword ptr [ebp-20h],edx
xor edx,edx
mov dword ptr [ebp-1Ch],edx
xor edx,edx
0000005b mov dword ptr [ebp+FFFFFF6Ch],edx
xor edx,edx
mov dword ptr [ebp+FFFFFF68h],edx
xor edx,edx
0000006b mov dword ptr [ebp-28h],edx
0000006e mov dword ptr [ebp-0Ch],
Dim s1 As String = "我是真的"
mov eax,dword ptr ds:[033C2194h]
0000007b mov dword ptr [ebp+FFFFFF04h],eax
Dim s2 As String = "我不是真的"
mov eax,dword ptr ds:[033C2198h]
mov dword ptr [ebp+FFFFFF00h],eax
Dim s3 As String
Dim mx As Integer =
0000008d mov dword ptr [ebp-10h],3B9ACA00h
Dim start As DateTime 'For iii As Integer = 0 To 9
start = DateTime.Now
lea ecx,[ebp+FFFFFF60h]
0000009a call 6678EAC8
0000009f lea edi,[ebp-18h]
000000a2 lea esi,[ebp+FFFFFF60h]
000000a8 movq xmm0,mmword ptr [esi]
000000ac movq mmword ptr [edi],xmm0
For ii As Integer = To mx
000000b0 mov eax,dword ptr [ebp-10h]
000000b3 mov dword ptr [ebp-28h],eax
000000b6 xor edx,edx
000000b8 mov dword ptr [ebp-1Ch],edx
000000bb nop
000000bc jmp 000000EA
If i = Then
000000be cmp dword ptr [ebp-0Ch],
000000c2 jne 000000D3
s3 = s1
000000c4 mov eax,dword ptr [ebp+FFFFFF04h]
000000ca mov dword ptr [ebp+FFFFFEFCh],eax
000000d0 nop
000000d1 jmp 000000DF
Else
s3 = s2
000000d3 mov eax,dword ptr [ebp+FFFFFF00h]
000000d9 mov dword ptr [ebp+FFFFFEFCh],eax
End If
Next
000000df add dword ptr [ebp-1Ch],
000000e3 jno 000000EA
000000e5 call 682F3C1A
000000ea mov eax,dword ptr [ebp-1Ch]
000000ed cmp eax,dword ptr [ebp-28h]
000000f0 jle 000000BE
Console.WriteLine((DateTime.Now - start).TotalMilliseconds)
000000f2 lea ecx,[ebp+FFFFFF58h]
000000f8 call 6678EAC8
000000fd lea eax,[ebp+FFFFFF58h]
sub esp,
movq xmm0,mmword ptr [eax]
0000010a movq mmword ptr [esp],xmm0
0000010f lea eax,[ebp-18h]
sub esp,
movq xmm0,mmword ptr [eax]
movq mmword ptr [esp],xmm0
0000011e lea ecx,[ebp+FFFFFF50h]
call 6678A950
lea edi,[ebp+FFFFFF70h]
0000012f lea esi,[ebp+FFFFFF50h]
movq xmm0,mmword ptr [esi]
movq mmword ptr [edi],xmm0
0000013d lea ecx,[ebp+FFFFFF70h]
call 6678DD38
fstp qword ptr [ebp+FFFFFF48h]
0000014e fld qword ptr [ebp+FFFFFF48h]
sub esp,
fstp qword ptr [esp]
0000015a call 66E72E20 start = DateTime.Now
0000015f lea ecx,[ebp+FFFFFF40h]
call 6678EAC8
0000016a lea edi,[ebp-18h]
0000016d lea esi,[ebp+FFFFFF40h]
movq xmm0,mmword ptr [esi]
movq mmword ptr [edi],xmm0
For ii As Integer = To mx
0000017b mov eax,dword ptr [ebp-10h]
0000017e mov dword ptr [ebp+FFFFFF6Ch],eax
xor edx,edx
mov dword ptr [ebp-20h],edx
nop
0000018a jmp 000001C4
s3 = If(i = , s1, s2)
0000018c cmp dword ptr [ebp-0Ch],
je 000001A1
nop
mov eax,dword ptr [ebp+FFFFFF00h]
mov dword ptr [ebp+FFFFFEF8h],eax
0000019f jmp 000001AD
000001a1 mov eax,dword ptr [ebp+FFFFFF04h]
000001a7 mov dword ptr [ebp+FFFFFEF8h],eax
000001ad mov eax,dword ptr [ebp+FFFFFEF8h]
000001b3 mov dword ptr [ebp+FFFFFEFCh],eax
Next
000001b9 add dword ptr [ebp-20h],
000001bd jno 000001C4
000001bf call 682F3C1A
000001c4 mov eax,dword ptr [ebp-20h]
000001c7 cmp eax,dword ptr [ebp+FFFFFF6Ch]
000001cd jle 0000018C
Console.WriteLine((DateTime.Now - start).TotalMilliseconds)
000001cf lea ecx,[ebp+FFFFFF38h]
000001d5 call 6678EAC8
000001da lea eax,[ebp+FFFFFF38h]
000001e0 sub esp,
000001e3 movq xmm0,mmword ptr [eax]
000001e7 movq mmword ptr [esp],xmm0
000001ec lea eax,[ebp-18h]
000001ef sub esp,
000001f2 movq xmm0,mmword ptr [eax]
000001f6 movq mmword ptr [esp],xmm0
000001fb lea ecx,[ebp+FFFFFF30h]
call 6678A950
lea edi,[ebp-30h]
lea esi,[ebp+FFFFFF30h]
0000020f movq xmm0,mmword ptr [esi]
movq mmword ptr [edi],xmm0
lea ecx,[ebp-30h]
0000021a call 6678DD38
0000021f fstp qword ptr [ebp+FFFFFF28h]
fld qword ptr [ebp+FFFFFF28h]
0000022b sub esp,
0000022e fstp qword ptr [esp]
call 66E72E20 start = DateTime.Now
lea ecx,[ebp+FFFFFF20h]
0000023c call 6678EAC8
lea edi,[ebp-18h]
lea esi,[ebp+FFFFFF20h]
0000024a movq xmm0,mmword ptr [esi]
0000024e movq mmword ptr [edi],xmm0
For ii As Integer = To mx
mov eax,dword ptr [ebp-10h]
mov dword ptr [ebp+FFFFFF68h],eax
0000025b xor edx,edx
0000025d mov dword ptr [ebp-24h],edx
nop
jmp 000002AC
s3 = IIf(i = , s1, s2)
push dword ptr [ebp+FFFFFF00h]
cmp dword ptr [ebp-0Ch],
0000026d sete cl
movzx ecx,cl
mov edx,dword ptr [ebp+FFFFFF04h]
call 55FD3238
0000027e mov dword ptr [ebp+FFFFFEF4h],eax
mov ecx,dword ptr [ebp+FFFFFEF4h]
0000028a call 55FAFAA0
0000028f mov dword ptr [ebp+FFFFFEF0h],eax
mov eax,dword ptr [ebp+FFFFFEF0h]
0000029b mov dword ptr [ebp+FFFFFEFCh],eax
Next
000002a1 add dword ptr [ebp-24h],
000002a5 jno 000002AC
000002a7 call 682F3C1A
000002ac mov eax,dword ptr [ebp-24h]
000002af cmp eax,dword ptr [ebp+FFFFFF68h]
000002b5 jle
Console.WriteLine((DateTime.Now - start).TotalMilliseconds)
000002b7 lea ecx,[ebp+FFFFFF18h]
000002bd call 6678EAC8
000002c2 lea eax,[ebp+FFFFFF18h]
000002c8 sub esp,
000002cb movq xmm0,mmword ptr [eax]
000002cf movq mmword ptr [esp],xmm0
000002d4 lea eax,[ebp-18h]
000002d7 sub esp,
000002da movq xmm0,mmword ptr [eax]
000002de movq mmword ptr [esp],xmm0
000002e3 lea ecx,[ebp+FFFFFF10h]
000002e9 call 6678A950
000002ee lea edi,[ebp-30h]
000002f1 lea esi,[ebp+FFFFFF10h]
000002f7 movq xmm0,mmword ptr [esi]
000002fb movq mmword ptr [edi],xmm0
000002ff lea ecx,[ebp-30h]
call 6678DD38
fstp qword ptr [ebp+FFFFFF08h]
0000030d fld qword ptr [ebp+FFFFFF08h]
sub esp,
fstp qword ptr [esp]
call 66E72E20 Console.WriteLine("--------------------------------")
0000031e mov ecx,dword ptr ds:[033C219Ch]
call 6682AAB8
'Next
End Sub
nop
0000032a lea esp,[ebp-]
0000032d pop esi
0000032e pop edi
0000032f pop ebp
ret

转化IL

对比不同点(If-Else || If(Express,SelecetValue1,SelectValue2) || IIf(Express,SelecetValue1,SelectValue2):

红色方框内的行数,影响到运行时间。

看后我们发现,If-Else 与 If(Express,SelectValue1,SelectValue2) 实现的IL代码几乎完全一样( If(Express,SelectValue1,SelectValue2) IL中虽然多执行了两步操作,但是仔细看你会发现只不过是进行了多余操作)。

那么我们在执行过程时,为什么If-Else的时间略比If(Express,SelectValue1,SelectValue2)的时间大呢? 那是因为If-Else里面多了nop 指令,如果没它,If-Else 比 If(Express,SelectValue1,SelectValue2) 快。

至于 IIf(Express,SelectValue1,SelectValue2)  那是因为里面多进行了两步call 指令,这两个过程是执行内存别处指令,执行完之后再跳转回执行下一条指令(应该是Iff有很多判断,比较复杂吧?!我没用有仔细查看内存)。

帮助信息(参阅 IL指令汇总):

dword ptr[ebp-0Ch]  :  取内存地址ebp-0Ch中的数据,地址ebp-0Ch中保存的是Integer i

cmp  dword ptr[ebp-0Ch]  ,   0   : 比较 i 和 0 【对两数进行相减,进行比较,不将两数的差放入第一个操作数,影响标志寄存器,个人认为应该影响零标识(ZF)和符号标识(SF),具体的请搜索下标志寄存器】

jne  000000d3  :    ZF=0 , 跳转至  000000d3  (ZF是零标识,若运算结果为零则ZF=1,否则ZF=0)

mov eax , dword ptr[ebp+FFFFFF04h] :  将操作数dword ptr[ebp+FFFFFF04h]送入eax寄存器 , 这个是什么玩意呢?  此句中的dword ptr[ebp+FFFFFF04h] 指向我们自定义的字符串

jmp 000000DF : 强制跳转至 000000DF

je 000001A1 :  ZF=1,跳转至  000001A1 (参考jne)

sete cl : 取标志寄存器中ZF的值, 放到cl中

call  55EC3238  :  调至55EC3238执行指令

movzx  ecx , cl : ecx 高位8~32位强制为0

nop :本指令不产生任何结果,仅消耗几个时钟周期的时间,接着执行后续指令,常用于程序的延时等

[VB] if 判断语句 和 If、IIf函数的比较的更多相关文章

  1. VB的判断语句和循环语句

      判断语句 •If语句 if语句共有4种写法: 第一种语法: If 条件判断语句 then 程序代码 第二种语法:If 条件判断语句 then 程序代码 else 程式代码 第三种语法: If 条件 ...

  2. Firefox 对条件判断语句块内的函数声明的处理与其他浏览器有差异

    标准参考 函数声明和函数表达式 定义一个函数有两种途径:函数声明和函数表达式. 函数声明: function Identifier ( FormalParameterList opt ) { Func ...

  3. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数

    t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数 源自:Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expre ...

  4. VB中IIF函数

    IIf 函数语法:IIf(表达式, 真值部分, 假值部分)根据表达式的值,表达式为真时,返回真值部分,表达式为假时,返回假部分.如:iif(a>0, "对","错& ...

  5. python--基础学习(二)判断 、循环、定义函数、继承、调用

    1.判断 if.elif 代码示范 # coding=utf-8 score = 90 if (score>=90): print("完美") print("优秀& ...

  6. Interview----求 1+2+...+n, 不能用乘除法、for、while if、else、switch、case 等关键字以及条件判断语句 (A?B:C)

    题目描述: 求 1+2+...+n, 要求不能使用乘除法.for.while.if.else.switch.case 等关键字以及条件判断语句 (A?B:C). 分析: 首先想到的是写递归函数,但是遇 ...

  7. 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法

    来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很 ...

  8. python最简洁的条件判断语句写法

    这篇文章主要介绍了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友可以参考下 如下一段代码: def isLen(s ...

  9. C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)

    来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很 ...

随机推荐

  1. Maven+Spring Profile实现生产环境和开发环境的切换

    第一步 Maven Profile配置 <profiles> <profile> <id>postgres</id> <activation> ...

  2. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  3. java 通过jdbc连接MySQL数据库

    先了解下JDBC的常用接口 1.驱动程序接口Driver 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类.通常情况下,通过java.lang.Clas ...

  4. JAVA多线程售票问题

    //定义一个类实现Runnable接口,定义一个需要同步的售票方法,然后重写run方法调用售票的sale方法 class SaleTicket implements Runnable{ private ...

  5. Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

    1.问题:Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 2.解决 ...

  6. Object-C与Swift混编

    1.在Object-C项目中调用Swift 1.1.创建一个Object-C project(项目名例如:YYDemo) 如下图 1.2.创建一个Swift Class,如下图 这里会显示是否需要创建 ...

  7. thrift笔记

    Thrift tutorial 演示 python服务端与客户端本文的开发环境是windows 7 + python2.7.3Thrift官方主页:http://thrift.apache.org/先 ...

  8. placehoder不兼容ie9以下和opero12以下

    颜色设置 解决方案一: ::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } :-moz-placeholder { /* ...

  9. C++风格的回调对象方法. 采用template实现

    今天看了一篇文章,收藏一下代码.读一读很有激情 #include <iostream> #include <string> #include <vector> us ...

  10. MySQL查询和删除重复数据

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...