单行的:If...then..与多行的:if...then....endif
让它们运行同样的循环百万次时间差别居然:前者比后者快多一倍时间了
Local $iTimer, $iVar = 1
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then $iVar = 1
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then
$iVar = 1
EndIf
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
;=======================================================
$iVar = 0
$iTimer = TimerInit()
For $i = 1 To 1000000
If Not $iVar Then $iVar = 0
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
$iTimer = TimerInit()
For $i = 1 To 1000000
If Not $iVar Then
$iVar = 0
EndIf
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
在我的机子结果是(毫秒):
2157.43
1368.96
2415.35
1686.04
配置:双核2G,3G内存,32位 不是的吧,以前我测试If ... Then ... EndIf 比If ... Then ... 效率快。If $iVar Then ... 比 If $iVar <> 0快,也当然比If Not $iVar快。 回复 3# pusofalse
对呀,我也是说多了Endif效率高很多。
If $iVar 比If Not $iVar快,还能想到:因为后者比前者多了一步先给$iVar变量Not了一下,肯定要慢点。
但单行的if...then比多行的If...then...endif效率低这么多,我都想不出原因了。可能得需要了解au3是怎么解析这样的句子吧。 回复 4# happytc
- -|||, 你1#说“前者比后者快多一倍时间了”,原来是误写。效率差别这么大,应该就是au3内部解析语句的缘故。 回复 5# pusofalse
呵,不是误写呀,我再看了下,‘前者’指单行,‘后者’指多行:前者比后者快多一倍时间了(时间用多了,当然效率低了)
但下面的,又反过来了,单行又比多行效率高很多了,被搞蒙了
$iVar = 0
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then $iVar = 0
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then
$iVar = 0
EndIf
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
回复 6# happytc
抱歉,是我理解错误,语文没学好。6#的测试很厉害,以前不知道,不知为何如此,看来一切都与AU3内部解释语句的方式有关,以后写代码要多多注意了。 Local $iTimer, $iVar = 0
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then $iVar = 0
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
$iTimer = TimerInit()
For $i = 1 To 1000000
If $iVar Then
$iVar = 0
EndIf
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
;=======================================================
$iVar = 0
$iTimer = TimerInit()
For $i = 1 To 1000000
If Not $iVar Then $iVar = 0
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
$iTimer = TimerInit()
For $i = 1 To 1000000
If Not $iVar Then
$iVar = 0
EndIf
Next
ConsoleWrite(Round(TimerDiff($iTimer), 2) & @CRLF)
大家看这段代码,更加奇怪,结果是
没加not单行:490.1
没加not多行:786.45
==============
加not单行:2004.59
加not多行:1325.96
也就是加了not的多行比单行快,不加的单行比多行快 AU3的解释器不严谨的原因吧!只能以后注意了! 让它们运行同样的循环百万次
时间差别居然:前者比后者快多一倍时间了
happytc 发表于 2011-10-18 10:56 http://www.autoitx.com/images/common/back.gif
1192.45
954.58
1301.37
1086.61 可以总结为
在声明变量的情况下(养成声明的习惯)
能写单行就写单行,能不用not就不用not.
必须not下不写单行。 噢。。。以前我都是看到“xx变量在使用前未声明”的报错再去添加声明。
现在写个小工具动不动就有近千行,效率还是挺重要的,否则累积效应够受的。
多谢大家的讨论与楼上的总结,我想我记住了! 回复 11# gzh888666
你这个总结不对
不能解释6#的情况 回复gzh888666
你这个总结不对
不能解释6#的情况
happytc 发表于 2011-10-18 22:41 http://www.autoitx.com/images/common/back.gif
可以解释呀!声明后能写单行就写单行! 个人愚见,对于脚本来说讨论这些基本流程控制关键字的效率完全没有意义,还不如花时间研究研究如何加快开发效率
页:
[1]
2