测试代码:

程序代码:
Private Sub Command1_Click()
Dim t As Double, a As Long, b As Long, i As Long
Dim s As String
a = -1234
t = Timer
For i = 0 To 100000000
b = a
If a < 0 Then b = 0 - a
Next
s = "方法一耗时:" & (Timer - t)
a = -1234
t = Timer
For i = 0 To 100000000
If a < 0 Then
b = Abs(a)
Else
b = a
End If
Next
s = s & vbCrLf & "方法二耗时:" & (Timer - t)
a = -1234
t = Timer
For i = 0 To 100000000
If a < 0 Then
b = -a
Else
b = a
End If
Next
s = s & vbCrLf & "方法三耗时:" & (Timer - t)
Text1.Text = s
End Sub
IDE环境运行结果:
方法一耗时:1.66900000000157
方法二耗时:1.29599999999988
方法三耗时:1.26999999999779
编译为本机代码运行结果:
方法一耗时:.116000000001165
方法二耗时:.212000000002796
方法三耗时:.0450000000032595
编译为伪代码运行结果:
方法一耗时:1.22499999999837
方法二耗时:1.04100000000326
方法三耗时:1.23399999999855
从我测试的结果来看,认真优化后的代码,不管IDE还是编译成本机代码
if 都比 abs 要快。
你方法一中:分析均忽略需要生成的寻址
b = a
产生 内存复制代码
If a < 0 Then b = 0 - a
产生条件跳转和一条内存复制代码
我优化后,方法三中:
If a < 0 Then
产生条件跳转
b = -a
一条内存复制,和一条无条件转移命令
Else
b = a
第二条内存复制命令,但这二条内存复制命令只会执行一条,
End If
无条件转移命令,好像是只需二个时钟周期,内存复制,二个寻码,一个复制,我不知道了。
等于减掉了一次内存复制,增加了一次无条件转移,节省了不少的时钟周期。