如何解决时间和CLOCK_PER_SEC计算错误的时间
我对此程序有疑问:
THREE.CanvasTexture
当我像这样编译和执行它时:#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <sys/times.h>
clock_t start_time;
clock_t get_user_ticks()
{
struct tms t;
times(&t);
return t.tms_utime;
}
void start_stopwatch()
{
start_time = get_user_ticks();
}
void stop_stopwatch()
{
clock_t stop_time = get_user_ticks();
double ticks = stop_time - start_time;
double s = ticks / CLOCKS_PER_SEC;
printf("elapsed time: %fs\n",s);
}
int main(int argc,char** argv)
{
start_stopwatch();
int sum = 0;
for (long i = 0; i < 1000000000; i++) {
sum += i;
}
printf("sum: %i\n",sum);
stop_stopwatch();
return 0;
}
我得到以下输出:
gcc -O0 test.c ; time ./a.out
为什么我的程序输出错误10000倍?以及如何像sum: -1243309312
elapsed time: 0.000250s
real 0m2.509s
user 0m2.508s
sys 0m0.000s
命令一样获得更高的精度?
在Debian Buster(64位)和gcc版本8.3.0上进行了测试。
解决方法
好吧,因为此处错误地使用了CLOCKS_PER_SEC
。 CLOCKS_PER_SEC
用于将clock()
的返回值转换为秒。但是...请注意posix times docs:
应用程序应使用sysconf(_SC_CLK_TCK)确定每秒的时钟滴答数,因为它可能因系统而异。
man 2 times在NOTES
部分中也提到了这一点。
要做:
double s = ticks / sysconf(_SC_CLK_TCK);
如何像time命令一样获得更高的精度?
使用getrusage
。另请参见bash sources of time command。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。