unique009 发表于 2012-11-26 12:47:40

长时间计时不要用TimerDiff,应该用_Date_Time_GetTickCount

本帖最后由 unique009 于 2012-11-26 22:44 编辑

前段时间我做了一个运算量很大的程序,运行一次几乎要占满CPU跑30分钟左右,之前一直用TimerDiff来计算每次的运行时间.有一次我在运行此程序的同时又开了另外好几个大程序,CPU双核都差不多占满了.大概一小时后那个程序才提示运算完成,但TimerDiff的结果仍然是30分钟左右,所以我当时很奇怪,又换成_Date_Time_GetTickCount跑了一遍,50多分钟,这差距也太大了,TimerDiff的结果居然比实际时间慢了40%,去官网也没找到相关解释.
我不知道TimerDiff内部是怎么实现的,但是看autoit帮助中TimerDiff的精度相当高(毫秒级,后面还有n个小数位),很可能是用的QueryPerformanceCounter函数吧,不过这个函数要用到QueryPerformanceFrequency的值,当CPU可以自动调频运行时,这个值好像不准吧

现在想起来这个问题,写出来讨论一下


刚想到还有一个asm指令rdtsc也是高精度的,但这个在双核机上应该也是不准的吧

annybaby 发表于 2012-11-26 12:57:59

回复 1# unique009

不知所云~~~

netegg 发表于 2012-11-26 13:23:07

本帖最后由 netegg 于 2012-11-26 13:34 编辑

按理说,timerdiff应该也是用的gettickcount或者timer api一类的,可能是核心编码中有什么改变吧,这个可能需要看autoit的源代码了
datetimer udf走的是api的路子,直接使用的是系统操作
估计不会用QueryPerformanceCounter这类高精度计时的

unique009 发表于 2012-11-26 13:49:45

不过就我所知GetTickCount之类的,精度只能到毫秒,但是看timerdiff虽然也是毫秒精度,但是小数点后那么多位,估计是纳秒级的吧

现在回想起来,我用的timerdiff好像就从来没准过,如果不是用QueryPerformanceCounter,那就很可能是asm指令rdtsc,但是这个指令在CPU乱序执行时是不准的,超线程或多核下也是不准的

unique009 发表于 2012-11-26 14:23:36

回复 3# netegg


    我记得论坛是08年五一开的,你8号注册,我23号注册,但金钱上差距咋这么大啊

netegg 发表于 2012-11-26 14:29:01

回复 5# unique009
贴数,时长,贡献

netegg 发表于 2012-11-26 14:31:49

本帖最后由 netegg 于 2012-11-26 14:33 编辑

回复 4# unique009
到不了,timerdiff是秒级,毫秒精度都是约数
zwdelayexecution,是毫秒级,纳秒是约数

annybaby 发表于 2012-11-26 15:23:21

回复 4# unique009


   后面的数根本没有意义的,比纳秒都小几亿倍~~
AU处理毫秒能准确些就满足了,别想微秒的事,特别是窗口消息相关的,接收个消息也需要1毫秒左右~~
太快了力不从心~

netegg 发表于 2012-11-26 15:47:04

本帖最后由 netegg 于 2012-11-26 15:49 编辑

回复 8# annybaby
不能这么说,这个可能和实际操作无关,但和运算机制的关系就大了
不太恰当的比方,字符串操作普通方式就可以完成为什么要用正则,尤其是一个特定字符串的时候

annybaby 发表于 2012-11-26 16:01:38

回复 9# netegg

是的,这个比方可能真的不太恰当~~

AU通过调用API来完成,但中间多了不少的其它判断等步骤,可能完成这些额外步骤所需要的时间,比自己要求的时间精度要大得多,所以结果就~~

netegg 发表于 2012-11-26 16:20:56

回复 10# annybaby
只是简单的无参数函数对调用产生的影响不大,一旦交给dll后,和auto的关系几乎就没有了

annybaby 发表于 2012-11-26 16:30:16

回复 11# netegg

嗯,简单的是,但好多都有参数吧,特别是一些还可能需要对如坐标等信息两转成结构之类的,然后还有一些判断等,效率上就慢多了~

当然,在UDF中自己处理一些数据,并用户更方便调用也可能正好是AU的魅力所在~~

netegg 发表于 2012-11-26 17:50:58

回复 12# annybaby
带参数的话意味着在进入dll前的处理过程,那是脚本自身处理的事,已经不再dll范围了
不信的话,你用二进制来写auto的文件,直接加载到内存运行,要快得多

annybaby 发表于 2012-11-26 19:21:22

回复 13# netegg

{:face (394):}
    我说的明显就是脚本自身,而不是说DLL慢~~

netegg 发表于 2012-11-26 19:40:07

本帖最后由 netegg 于 2012-11-26 19:47 编辑

回复 14# annybaby
楼主发帖的主题可以引申到是使用脚本自身代码处理还是api处理的问题,是如何计时准确,不是如何处理数据快
你把赋值结构单提出来,我才会有上面一说
页: [1] 2 3
查看完整版本: 长时间计时不要用TimerDiff,应该用_Date_Time_GetTickCount