Qokelate 发表于 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




效率差一个数量级啊,有木有啊有木有

xms77 发表于 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 完成::0
+>22:39:37 ACNWrapper 完成..
>退出代码: 0        运行时间: 10.103 秒

Qokelate 发表于 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: 这里的数量级是指位数少了一位,而非意义上的"数量级"

{:1_496:}

user3000 发表于 2013-2-21 12:35:23

516.4653180662
632.227900232685
+>12:32:28 AutoIT3.exe 完成::0
+>12:32:30 ACNWrapper 完成..
>退出代码: 0        运行时间: 3.799 秒我有点高兴, 不愧是去年刚买的本子,运行速度挺快的.
我又很羞愧,没用它敲过多少行代码!

skyfree 发表于 2013-2-27 09:16:02

460.722283023783
606.650091608539
+>09:14:40 AutoIT3.exe 完成::0
+>09:14:41 ACNWrapper 完成..
>退出代码: 0        运行时间: 3.241 秒有差别吗?“==”的判定规则比“=”更严格,慢一点很正常,但也不至于差一个数量级那么多

junyees 发表于 2013-2-27 16:13:52

学多了要迷糊啊
C中==才是AU3中的=号.

xms77 发表于 2013-2-27 20:06:32

回复 3# Qokelate
我的运行时间和你的运行时间比,真的差数量级了,我的老本本啊!{:face (229):}

3mile 发表于 2013-3-3 23:56:14

回复 7# xms77
我是来歪楼的,兄弟的本本的确有点慢哦
464.710178766
597.148570265421
+>23:54:12 AutoIT3.exe 完成::0
+>23:54:13 ACNWrapper 完成..
>退出代码: 0        运行时间: 2.626 秒

xms77 发表于 2013-3-4 06:17:25

速度比我更慢的,有木有?

txen548 发表于 2013-3-5 11:59:22

看不懂是啥意思

zisedefeng 发表于 2013-3-6 13:03:29

?“==”的判定规则比“=”更严格,慢一点很正常,就是。

雨林GG 发表于 2013-3-12 09:08:34

难道是真的~!

pusofalse 发表于 2013-3-23 13:30:09

看到这个帖子里的回复,差点要颠覆我的认知。==竟然比=慢,怎么可能是这样?原来楼主给出的代码有问题。

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

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

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

综上,判定==与=两个比较符,到底哪个执行效率高,应该用如下代码来测试。在我的机器上,代码的输出为:
2197.88073623882
984.238499585841Local $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
页: [1]
查看完整版本: 多打一个等号或许会把代码效率降低一个数量级? 有例子有真相