免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11797 | 回复: 20
打印 上一主题 下一主题

在C里面如何将程序执行时间精确到毫秒或者更加精确!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-10 11:42 |只看该作者 |倒序浏览
C语言中,我想测试两个算法的执行时间,看看哪个更快,但是调用系统时间函数都只能精确到秒,看不出差别,有没有哪位大侠知道怎样才能把程序执行时间精确到毫秒或者更加精确?急,谢谢!!

最好有现成可以直接运行的代码!!

                    ——(windows xp系统  VC++6.0)

[ 本帖最后由 huihuiqi 于 2009-7-10 13:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-10 11:52 |只看该作者
man time看一下

论坛徽章:
0
3 [报告]
发表于 2009-07-10 11:54 |只看该作者

回复 #1 huihuiqi 的帖子

usleep
windows Sleep

评分

参与人数 1可用积分 +5 收起 理由
samon_fu + 5 我很赞同

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2009-07-10 12:17 |只看该作者
QueryPerformanceCounter((LARGE_INTEGER*)&lStart);

gettimeofday (&tvStart,NULL);
这两个凑合用,
我感觉可以让你的算法跑几万次,然后测量.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-07-10 12:40 |只看该作者
x86中就用rdtsc,应该没有比这更精确了,不过多核下好像有点问题。
windows中就用QueryPerformanceCounter,也是精度最高的了。

非x86非windows嘛…… gettimeofday?
我不知道这函数能达到多少精度, 这函数我是从opencv的代码中找到的……

贴一下opencv中cvGetTickCount的代码吧……  希望有用
CV_IMPL  int64  cvGetTickCount( void )
{
    const CvProcessorInfo* cpu_info = icvGetProcessorInfo();

    if( CV_GET_PROC_ARCH(cpu_info->model) == CV_PROC_IA32_GENERIC )
    {
#ifdef MASM_INLINE_ASSEMBLY
    #ifdef __BORLANDC__
        __asm db 0fh
        __asm db 31h
    #else
        __asm _emit 0x0f;
        __asm _emit 0x31;
    #endif
#elif (defined __GNUC__ || defined CV_ICC) && defined __i386__
        int64 t;
        asm volatile (".byte 0xf; .byte 0x31" /* "rdtsc" */ : "=A" (t));
        return t;
#else
        static const char code[] = "\x0f\x31\xc3";
        rdtsc_func func = (rdtsc_func)(void*)code;
        return func();
#endif
    }
    else
    {
#if defined WIN32 || defined WIN64
        LARGE_INTEGER counter;
        QueryPerformanceCounter( &counter );
        return (int64)counter.QuadPart;
#else
        struct timeval tv;
        struct timezone tz;
        gettimeofday( &tv, &tz );
        return (int64)tv.tv_sec*1000000 + tv.tv_usec;
#endif
    }
}

评分

参与人数 1可用积分 +10 收起 理由
samon_fu + 10 我很赞同。本是要给你这个帖子加的,结 ...

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2009-07-10 12:49 |只看该作者

回复 #5 OwnWaterloo 的帖子

哇,好强

论坛徽章:
0
7 [报告]
发表于 2009-07-10 13:08 |只看该作者
原帖由 OwnWaterloo 于 2009-7-10 12:40 发表
x86中就用rdtsc,应该没有比这更精确了,不过多核下好像有点问题。
windows中就用QueryPerformanceCounter,也是精度最高的了。

非x86非windows嘛…… gettimeofday?
我不知道这函数能达到多少精度, 这函 ...


滑铁卢说的没差,听他的就行。
可能的话,最好用绑定单核,然后用汇编指令。
最好听4楼的测量跑几万次的总时间,不然单词执行的时间受CPU任务调度以及其他方面的影响,波动很大。

但如果开始时间与结束时间间隔非常短的话,
一下两个POSIX函数 clock_gettime 和 gettimeday可能会出现时间相同,甚至时间回溯的“时光倒流”景象。
我曾经遇到过。网上说,这是XXX还是YYY决定的(记不起来了 ),没有办法改~~~~
so,~~~so-so~~~:wink:

论坛徽章:
0
8 [报告]
发表于 2009-07-10 13:13 |只看该作者
gettimeofday在1.4内核上遇到过时间回滚的现象.没找到好的解决方法,只好重侧..2.6貌似没这个问题了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2009-07-10 13:17 |只看该作者
回复 #7 swxlion 的帖子
其实是听opencv的……  我只是照抄了一遍……

我说rdstc在多核上的问题就是“时光倒流”, 问题也不是我发现的:
http://bbs.bccn.net/thread-255632-1-1.html

原帖由 swxlion 于 2009-7-10 13:08 发表
最好听4楼的测量跑几万次的总时间,不然单词执行的时间受CPU任务调度以及其他方面的影响,波动很大。


关于这个, 如果有了高精度的计时器(比如已经精确到cpu tick), 是否反而应该测量只跑一次的结果?
测量跑多次的总时间会受调度方面的影响。

“测量多次,每次只跑一次,取多次结果中的最小值”, 也不是我想到的……  云风说的……

[ 本帖最后由 OwnWaterloo 于 2009-7-10 13:18 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-07-10 13:45 |只看该作者

回复 #5 OwnWaterloo 的帖子

对,我是在windows中,QueryPerformanceCounter这个函数具体怎么用啊?
我看了半天MSDN也没搞懂,程序还报错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP