happytc 发表于 2011-10-18 10:56:24

单行的: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)

happytc 发表于 2011-10-18 10:59:21

在我的机子结果是(毫秒):
2157.43
1368.96
2415.35
1686.04

配置:双核2G,3G内存,32位

pusofalse 发表于 2011-10-18 11:12:33

不是的吧,以前我测试If ... Then ... EndIf 比If ... Then ... 效率快。If $iVar Then ... 比 If $iVar <> 0快,也当然比If Not $iVar快。

happytc 发表于 2011-10-18 11:19:40

回复 3# pusofalse

对呀,我也是说多了Endif效率高很多。
If $iVar 比If Not $iVar快,还能想到:因为后者比前者多了一步先给$iVar变量Not了一下,肯定要慢点。

但单行的if...then比多行的If...then...endif效率低这么多,我都想不出原因了。可能得需要了解au3是怎么解析这样的句子吧。

pusofalse 发表于 2011-10-18 11:24:55

回复 4# happytc


   - -|||, 你1#说“前者比后者快多一倍时间了”,原来是误写。效率差别这么大,应该就是au3内部解析语句的缘故。

happytc 发表于 2011-10-18 11:36:54

回复 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)

pusofalse 发表于 2011-10-18 11:47:51

回复 6# happytc


    抱歉,是我理解错误,语文没学好。6#的测试很厉害,以前不知道,不知为何如此,看来一切都与AU3内部解释语句的方式有关,以后写代码要多多注意了。

tryhi 发表于 2011-10-18 14:58:07

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的多行比单行快,不加的单行比多行快

gzh888666 发表于 2011-10-18 16:11:42

AU3的解释器不严谨的原因吧!只能以后注意了!

gzh888666 发表于 2011-10-18 16:24:09

让它们运行同样的循环百万次

时间差别居然:前者比后者快多一倍时间了
happytc 发表于 2011-10-18 10:56 http://www.autoitx.com/images/common/back.gif


    1192.45
954.58
1301.37
1086.61

gzh888666 发表于 2011-10-18 16:32:03

可以总结为
在声明变量的情况下(养成声明的习惯)
能写单行就写单行,能不用not就不用not.
必须not下不写单行。

xiehuahere 发表于 2011-10-18 22:35:09

噢。。。以前我都是看到“xx变量在使用前未声明”的报错再去添加声明。
现在写个小工具动不动就有近千行,效率还是挺重要的,否则累积效应够受的。
多谢大家的讨论与楼上的总结,我想我记住了!

happytc 发表于 2011-10-18 22:41:42

回复 11# gzh888666


    你这个总结不对
不能解释6#的情况

gzh888666 发表于 2011-10-19 22:22:11

回复gzh888666


    你这个总结不对
不能解释6#的情况
happytc 发表于 2011-10-18 22:41 http://www.autoitx.com/images/common/back.gif

可以解释呀!声明后能写单行就写单行!

298311657 发表于 2011-10-19 22:38:06

个人愚见,对于脚本来说讨论这些基本流程控制关键字的效率完全没有意义,还不如花时间研究研究如何加快开发效率
页: [1] 2
查看完整版本: 单行的:If...then..与多行的:if...then....endif