找回密码
 加入
搜索
查看: 5623|回复: 15

[AU3基础] 单行的:If...then..与多行的:if...then....endif

 火.. [复制链接]
发表于 2011-10-18 10:56:24 | 显示全部楼层 |阅读模式
让它们运行同样的循环百万次

时间差别居然:前者比后者快多一倍时间了


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)
 楼主| 发表于 2011-10-18 10:59:21 | 显示全部楼层
在我的机子结果是(毫秒):
2157.43
1368.96
2415.35
1686.04

配置:双核2G,3G内存,32位
发表于 2011-10-18 11:12:33 | 显示全部楼层
不是的吧,以前我测试If ... Then ... EndIf 比If ... Then ... 效率快。If $iVar Then ... 比 If $iVar <> 0快,也当然比If Not $iVar快。
 楼主| 发表于 2011-10-18 11:19:40 | 显示全部楼层
回复 3# pusofalse

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

但单行的if...then比多行的If...then...endif效率低这么多,我都想不出原因了。可能得需要了解au3是怎么解析这样的句子吧。
发表于 2011-10-18 11:24:55 | 显示全部楼层
回复 4# happytc


   - -|||, 你1#说“前者比后者快多一倍时间了”,原来是误写。效率差别这么大,应该就是au3内部解析语句的缘故。
 楼主| 发表于 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)

评分

参与人数 1金钱 +20 收起 理由
pusofalse + 20 学习了。

查看全部评分

发表于 2011-10-18 11:47:51 | 显示全部楼层
回复 6# happytc


    抱歉,是我理解错误,语文没学好。6#的测试很厉害,以前不知道,不知为何如此,看来一切都与AU3内部解释语句的方式有关,以后写代码要多多注意了。
发表于 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的多行比单行快,不加的单行比多行快
发表于 2011-10-18 16:11:42 | 显示全部楼层
AU3的解释器不严谨的原因吧!只能以后注意了!
发表于 2011-10-18 16:24:09 | 显示全部楼层
让它们运行同样的循环百万次

时间差别居然:前者比后者快多一倍时间了
happytc 发表于 2011-10-18 10:56



    1192.45
954.58
1301.37
1086.61
发表于 2011-10-18 16:32:03 | 显示全部楼层
可以总结为
在声明变量的情况下(养成声明的习惯)
能写单行就写单行,能不用not就不用not.
必须not下不写单行。
发表于 2011-10-18 22:35:09 | 显示全部楼层
噢。。。以前我都是看到“xx变量在使用前未声明”的报错再去添加声明。
现在写个小工具动不动就有近千行,效率还是挺重要的,否则累积效应够受的。
多谢大家的讨论与楼上的总结,我想我记住了!
 楼主| 发表于 2011-10-18 22:41:42 | 显示全部楼层
回复 11# gzh888666


    你这个总结不对
不能解释6#的情况
发表于 2011-10-19 22:22:11 | 显示全部楼层
回复  gzh888666


    你这个总结不对
不能解释6#的情况
happytc 发表于 2011-10-18 22:41


可以解释呀!声明后能写单行就写单行!
发表于 2011-10-19 22:38:06 | 显示全部楼层
个人愚见,对于脚本来说讨论这些基本流程控制关键字的效率完全没有意义,还不如花时间研究研究如何加快开发效率
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-20 22:46 , Processed in 0.093809 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表