找回密码
 加入
搜索
查看: 4276|回复: 12

多打一个等号或许会把代码效率降低一个数量级? 有例子有真相

 火.. [复制链接]
发表于 2013-2-20 22:04:30 | 显示全部楼层 |阅读模式
本帖最后由 Qokelate 于 2013-2-20 22:06 编辑



Local $a = 'aaaa'
Local $b = $a

Local $x = 0
Local $hTime = TimerInit()
For $a = 1 To 1000000
        If $a = $b Then $x += 1
Next
ConsoleWrite(TimerDiff($hTime))
ConsoleWrite(@CRLF)

Local $x = 0
Local $hTime = TimerInit()
For $a = 1 To 1000000
        If $a == $b Then $x += 1
Next
ConsoleWrite(TimerDiff($hTime))
ConsoleWrite(@CRLF)

Exit




效率差一个数量级啊,有木有啊有木有
发表于 2013-2-20 22:40:58 | 显示全部楼层
本帖最后由 xms77 于 2013-3-4 06:16 编辑

回复 1# Qokelate
差不多啊!哪里差一个数量级啊?
>运行:(3.3.9.4):D:\autoit3\autoit3.exe "I:\Removable Disk\my program\777.au3"    
3360.64779182829
4349.85284442576
+>22:39:36 AutoIT3.exe 完成:[CODE]:0
+>22:39:37 ACNWrapper 完成..
>退出代码: 0        运行时间: 10.103 秒
 楼主| 发表于 2013-2-20 22:57:45 | 显示全部楼层
本帖最后由 Qokelate 于 2013-2-20 23:01 编辑
>"D:\xTool\AutoIt\AutoIt3.exe" "Z:\a.au3"    
842.921131137027
1156.22882089049
>退出代码: 0        运行时间: 2.195 秒
版本 3.3.9.4

PS: 这里的数量级是指位数少了一位,而非意义上的"数量级"

发表于 2013-2-21 12:35:23 | 显示全部楼层
516.4653180662
632.227900232685
+>12:32:28 AutoIT3.exe 完成:[CODE]:0
+>12:32:30 ACNWrapper 完成..
>退出代码: 0        运行时间: 3.799 秒
我有点高兴, 不愧是去年刚买的本子,运行速度挺快的.
我又很羞愧,没用它敲过多少行代码!
发表于 2013-2-27 09:16:02 | 显示全部楼层
460.722283023783
606.650091608539
+>09:14:40 AutoIT3.exe 完成:[CODE]:0
+>09:14:41 ACNWrapper 完成..
>退出代码: 0        运行时间: 3.241 秒
有差别吗?“==”的判定规则比“=”更严格,慢一点很正常,但也不至于差一个数量级那么多
发表于 2013-2-27 16:13:52 | 显示全部楼层
学多了要迷糊啊
C中==才是AU3中的=号.
发表于 2013-2-27 20:06:32 | 显示全部楼层
回复 3# Qokelate
我的运行时间和你的运行时间比,真的差数量级了,我的老本本啊!
发表于 2013-3-3 23:56:14 | 显示全部楼层
回复 7# xms77
我是来歪楼的,兄弟的本本的确有点慢哦
464.710178766
597.148570265421
+>23:54:12 AutoIT3.exe 完成:[CODE]:0
+>23:54:13 ACNWrapper 完成..
>退出代码: 0        运行时间: 2.626 秒
发表于 2013-3-4 06:17:25 | 显示全部楼层
速度比我更慢的,有木有?
发表于 2013-3-5 11:59:22 | 显示全部楼层
看不懂是啥意思
发表于 2013-3-6 13:03:29 | 显示全部楼层
?“==”的判定规则比“=”更严格,慢一点很正常,就是。
发表于 2013-3-12 09:08:34 | 显示全部楼层
难道是真的~!
发表于 2013-3-23 13:30:09 | 显示全部楼层
看到这个帖子里的回复,差点要颠覆我的认知。==竟然比=慢,怎么可能是这样?原来楼主给出的代码有问题。

应该知道,使用==比较两个字符串时,会区分大小写,除此以外它就没有任何意义。其他形式的判断,例如比较两个数值,或比较两个不需要区分大小写的字符串,都可以用=代替。

楼主兄给出的代码,在For循环中比较的是数字和字符串,是两种类型不一样的数据,虽然AU3是一种语法相对宽松的脚本语言,但是在代码中的任何地方,都应该避免这样的比较(等号两边的值,其类型不一样),事实上,这种不严谨的比较在代码中的任何地方都可以完全避免。自己编写一个UDF时,应该明确定义参数的类型是字符串还是数字,假若他人在调用这个UDF时,因指定了错误类型的值而调用失败,从而没有得到预期的结果,问题出在这个人身上,而不是UDF的作者身上。

使用=比较两个字符串,效率会远低于使用==。使用==的确会进行更加严格的比较,然而所谓“更加严格”,并不意味着执行效率会因此变得低下。应该注意到,使用=比较两个字符串时,解析器会首先将两个字符串临时转换为全部大写或全部小写(或在比较过程中进行转换),而使用==进行比较时,就没有这样的转换,既然少了这个转换过程,==的效率当然会快于=。

综上,判定==与=两个比较符,到底哪个执行效率高,应该用如下代码来测试。在我的机器上,代码的输出为:
2197.88073623882
984.238499585841
Local $a = "AAAA"
Local $b = "aaaa"
 
Local $x = 0
Local $hTime = TimerInit()
For $i = 1 To 1000000
        If $a = $b Then $x += 1
Next
ConsoleWrite(TimerDiff($hTime))
ConsoleWrite(@CRLF)
 
$x = 0
$hTime = TimerInit()
For $i = 1 To 1000000
        If $a == $b Then $x += 1
Next

ConsoleWrite(TimerDiff($hTime))
ConsoleWrite(@CRLF)
 
Exit
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-25 17:26 , Processed in 0.202356 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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