看了半天终于看懂了Dicky的代码。想通了其实很简单。把原理和伪代码记录一下备忘:)
最终的原理很简单:
执行指定的几句汇编(比较好用了指令周期个数),然后计算执行这段代码的时间。
然后。。。
。。。
。。。
完了-_-b
当然这其中有几个小的trick
1 开始执行汇编之前先要把优先级提到最高,汇编也不要太长,尽量防止CPU被别的进程打断
2 计算执行代码的时间的方法
Windows下最精确好像也只有Gettickcount了。但是他也只是到ms级别,比起动辄上百Mhz的CPU来说,1ms可以执行上百条指令了,那还测个p啊。。。
米关系,我可以测试1ms到底做多少次Gettickcount不就好了。。可惜看不到windows的Gettickcount用了多少个指令周期,否则直接就可以算出来了。所以只好用个折中的方案,代码如下
void GetTimeCycle(int* p)
{
int n=1;
int j;
int i = GetTickCount();
while ((j = GetTickCount())==i)
++n;
p[0] = j;
p[1] = n;
}
通过n的计数来得到1ms中执行Gettickcount的次数。这样,测试的精度就变成了Gettickcount所需要的时间了。
原理和难点就是这些,源码就免了,毕竟是dicky的代码:P
最终的原理很简单:
执行指定的几句汇编(比较好用了指令周期个数),然后计算执行这段代码的时间。
然后。。。
。。。
。。。
完了-_-b
当然这其中有几个小的trick
1 开始执行汇编之前先要把优先级提到最高,汇编也不要太长,尽量防止CPU被别的进程打断
2 计算执行代码的时间的方法
Windows下最精确好像也只有Gettickcount了。但是他也只是到ms级别,比起动辄上百Mhz的CPU来说,1ms可以执行上百条指令了,那还测个p啊。。。
米关系,我可以测试1ms到底做多少次Gettickcount不就好了。。可惜看不到windows的Gettickcount用了多少个指令周期,否则直接就可以算出来了。所以只好用个折中的方案,代码如下
void GetTimeCycle(int* p)
{
int n=1;
int j;
int i = GetTickCount();
while ((j = GetTickCount())==i)
++n;
p[0] = j;
p[1] = n;
}
通过n的计数来得到1ms中执行Gettickcount的次数。这样,测试的精度就变成了Gettickcount所需要的时间了。
原理和难点就是这些,源码就免了,毕竟是dicky的代码:P
loop's blog