使用clock() 函数来进行计时,时不时的返回一个很大的负数,怎么检查也检查不出错误,现在找出错误原因,给大家分享一下。

来源网页:http://kebe-jea.blogbus.com/logs/33603387.html

跑实验的时候,结果时不时出现统计时间是负数的问题……开始以为是逻辑错误,程序调了个底儿掉,没找到错误。今天突然意识到应该是计时出了问题,clock()返回的是长整数,加上linux下的CLOCKS_PER_SEC是1000000(Windows下这个数是1000,难怪原来用的时候没有发现问题),运行时间长了自然会越界,然后会滚回滚。

之后翻clock的帮助文档,发现里边写到

Note that the time can wrap around. On a 32-bit system where CLOCKS_PER_SEC equals 1000000 this function will return the same value approximately every 72 minutes.

我每次开始记录下clock()返回值,结束时记录下,做差,记录结果,难怪会出错,而且可重复性那么差,半个小时才重现一次错误。

发现了问题,接着就得找解决方法。找来找去(其中在碧海青天C版版主同学帮助下,顺便强烈感谢) 知道了用timeval结构体能解决问题。

timeval里边有俩成员,tv_sec 的单位是秒;tv_usec 的单位是 1 / CLOCKS_PER_SEC = 0.000001秒,记录时间的时候用gettimeofday函数,下面摘自man gettimeofday

#include <sys/time.h>

  int gettimeofday(struct timeval *tv, struct timezone *tz);

  int settimeofday(const struct timeval *tv, const struct timezone *tz);

  Feature Test Macro Requirements for glibc (see feature_test_macros()):

  settimeofday(): _BSD_SOURCE

DESCRIPTION
The functions gettimeofday() and settimeofday() can get and set the
time as well as a timezone. The tv argument is a struct timeval (as
specified in <sys/time.h>): struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
}; and gives the number of seconds and microseconds since the Epoch (see
time()). The tz argument is a struct timezone: struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
}; 这样计算时差就很容易了, timeval tv, tv1;
gettimeofday(&tv, );
//blah blah
gettimeofday(&tv1, );
cout<<(tv1.tv_sec - tv.tv_sec + (double)(tv1.tv_usec - tv.tv_usec) / CLOCKS_PER_SEC)<<endl;

转贴地址:http://blog.csdn.net/panyuequn/article/details/5046223

clock函数返回负值~ (转)的更多相关文章

  1. C 语言 clock() 函数,例:计算多项式值

    C 语言 clock() 函数,例:计算多项式值 /** * clock(): 捕捉从程序开始运行到 clock() 被调用时所耗费的时间. * 这个时间单位是 clock tick, 即" ...

  2. clock()函数的返回值精度问题

    clock()函数返回值为1毫秒,就是0.001秒.clock函数功 能: 返回处理器调用某个进程或函数所花费的时间.用 法: clock_t clock(void);说明:clock_t其实就是lo ...

  3. 用clock()函数计时的坑

    程序中经常用time()函数来返回当前系统时间的秒数,来计时或计算时间差.如果需要用到更高精度的时间,就会自然想到用clock()函数.想当然的认为它返回从程序开始tick数,用clock()/CLO ...

  4. 不要在Lua中使用os.clock()函数

    1.os.clock函数的实现是调用了c语言的函数函数库,实现代码如下: static int os_clock (lua_State *L) { lua_pushnumber(L, ((lua_Nu ...

  5. Clock函数用法

    clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 这个函数返回从“开启这个程序进程 ...

  6. times、 time、clock函数说明

    sysconf( _SC_CLK_TCK )  功能  获取系统的 时钟滴答的频率. clock_gettime() clock()返回的是各个线程运行cpu时间的和, 返回值一直都是0. 定义函数: ...

  7. Clock()函数简单使用(C库函数)

    Clock()函数简单使用(转) 存在于标准库<time.h> 描述 C 库函数 clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间.为了获 ...

  8. printf函数返回值

    //返回值:正确返回输出的字符总数,错误返回负值,与此同时,输入输出流错误标志将被置值,可由指示器ferror来检查输入输出流的错误标志. #include <stdio.h> #defi ...

  9. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

随机推荐

  1. 下载并安装Prism5.0库 Download and Setup Prism Library 5.0 for WPF(英汉对照版)

    Learn what’s included in Prism 5.0 including the documentation, WPF code samples, and libraries. Add ...

  2. Struts12---文件的下载

    01.创建一个下载的页面  (我们的下载是把文件的路径写成固定的) <body> <form action="user/download" method=&quo ...

  3. Template pattern模板方法模式

    1>模板模式定义了算法的步骤,把这些步骤的实现延续到子类 2>模板模式为我们提供了一个代码复用的技巧 3>模板抽象类中可以定义具体方法.抽象方法和钩子方法 4>为了防止子类改变 ...

  4. 你不知道的sticky

    position:sticky,Chrome新版本已经做了支持.sticky的中文翻译是“粘性的”,position:sticky表现也符合这个粘性的表现.基本上,可以看出是position:rela ...

  5. C与C++结构体的区别

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  6. linux rm删除含有特殊符号目录或者文件

    想要删除time$1.class,用rm time$1.class是不行的,可以用 rm time"$"1.class 删掉   假设Linux系统中有一个文件名叫“-polo”. ...

  7. Django之 路由系统

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  8. 在spring配置文件中的 <context:property-placeholder/>用途

    location属性为 具体配置文件的classpath:地址 (可以取配置文件中的值利用${key}的形式,而不用多次写值) 1.这样一来就可以为spring配置的bean的属性设置值了,比如spr ...

  9. python学习之控制语句

    #if statement number=int(input("please input a number")); if number<10 : print("is ...

  10. Lua编程

    lua编程大杂烩.博客其他方面也不错.先记录.http://www.cnblogs.com/stephen-liu74/category/360139.html