| 无双 回复于:2003-07-10 12:37:47
|
OK
保留到精华中
以后有想改进的也好跟
|
| 无双 回复于:2003-07-09 17:46:11
|
如果是UNIX上的话蜗兄弟就可以再加一篇精华了
在unix上是不是也可以一样用
|
| qjlemon 回复于:2003-07-10 08:17:40
|
UNIX下可以的,我在FreeBSD下试过,当然,只能在Pentium上用,因为使用了嵌入汇编:
inline long long GetCycleCount()
{
__asm ("RDTSC");
}
main()
{
long long count;
count = GetCycleCount();
sleep(1);
printf("%d\n", GetCycleCount() - count);
}
|
| qjlemon 回复于:2003-07-10 08:19:37
|
不过偶不是太能保证准确性 
|
| 大菠萝 回复于:2003-07-10 10:30:19
|
加精
|
| 蓝色键盘 回复于:2003-07-10 12:54:17
|
如果在unix上,用pselect可以得到纳秒级别的时间。
|
| qjlemon 回复于:2003-07-10 13:20:22
|
好象普通的select也挺好用的吧?可能精度稍稍低一点,不过绝大多数情况下应该是够用了。
用那条汇编指令的话在设备驱动程序里可以用一用。
|
| 无双 回复于:2003-07-10 13:45:38
|
当然如果这样使用的话
得到的时间还是很准确的
在有这种需要时可以一试
只是造成的代码可移植性比较差了点
|
| qjlemon 回复于:2003-07-10 13:49:58
|
是啊!确实存在移植性的问题。不过要是被老板逼急了,哪还顾得了那个!呵呵 
|
| josuya 回复于:2003-07-11 09:27:16
|
对该文的一点补充:
应该注意以下几点
1 根据intel的介绍,由于在现代的处理器中都具有指令乱序执行的功能,因此在有些情况下rdtsc指令并不能很好的反映真实情况。解决方法是,在rdtsc之前加一些cpuid指令,使得rdtsc后面的指令顺序执行。
2 另外,rdtsc是一条慢启动的指令,第一次执行需要比较长的启动时间,而第二次之后时间就比较短了,也就是说,这条指令在第一次工作时需要比较长的时钟周期,之后就会比较短了。所以可以多运行几次,避过第一次的消耗。
3 大家在测试某一个函数的cpu周期的时候,如果精度要求很高,需要减去rdtsc的周期消耗。我在至强2.6G上测试的结果是大约500多个时钟周期,我想这是应该考虑在内的,很多小的函数也就是几K个时钟周期。
4 一定要注意cache的影响。如果你在对同一组数据进行操作,第一次操作往往要比后面几次时间开销大,原因就在于cache的缓存功能,而这一部分是不可见的。
希望以上经验能对大家有帮助!:)
|
| powerplane 回复于:2003-07-11 09:52:49
|
Did you ever try libevent?
http://www.monkey.org/~provos/libevent/
It is cross platform (linux/FreeBSD), and implement in a low-level way:
use k-queue(for fbsd) and epool(for linux). It is much lower resource taken than "select", may give you a more precise time control(I am not quite sure at this point),since it's a low-level implementation......
|