用 time.h 在 C 中计时
Timing in C with time.h
我正在研究 Ubuntu,我想用 C 语言为汇编函数计时。
那是我的代码:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
extern void assembler_function(char*,int);
int main(){
char *text1 = "input.txt";
clock_t start=clock();
sleep(3); // used for test
//assembler_function(text1,0);
clock_t stop=clock();
//printf("%d %f\n",(int)stop,((float)stop)/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)start/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)stop/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)(stop-start)/CLOCKS_PER_SEC);
return 0;
}
结果是:
时间:0.000000
时间:0.000000
时间:0.000000
如果CLOCKS_PER_SEC
是1000000
的典型值,那么您测量的范围完全有可能小于一个时钟(1微秒)。此外,除了调用本身的开销外,sleep
不会增加 clock
,因为 clock
测量的是处理时间,而不是挂钟时间。
相反,尝试测量多次调用汇编函数所花费的时间,然后将结果除以迭代次数。如果执行汇编程序函数的总时间非常小(例如 1ns),您需要巧妙地执行此操作,否则循环的开销最终可能成为测量的重要部分。
这是一个在 Ubuntu 框上编译的简单示例:
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
int64_t timestamp_now (void)
{
struct timeval tv;
gettimeofday (&tv, NULL);
return (int64_t) tv.tv_sec * CLOCKS_PER_SEC + tv.tv_usec;
}
double timestamp_to_seconds (int64_t timestamp)
{
return timestamp / (double) CLOCKS_PER_SEC;
}
int
main ()
{
int64_t start = timestamp_now ();
sleep (1);
printf ("sleep(1) took %f seconds\n",
timestamp_to_seconds (timestamp_now () - start));
return 0;
}
来自 clock()
的有用 man
页面:
DESCRIPTION
The clock() function returns an **approximation of processor time used by the program**.
换句话说,clock()
可能不是你想要的,因为你想计算经过的挂钟时间,而不是CPU-使用时间(注意:sleep()
几乎不使用 CPU 时间 - 它只是为将来的唤醒时间设置闹钟,然后,好吧,睡觉......)。
使用差异时间:
第一个:
time_t t_ini;
t_ini=time(NULL);
最后:
difftime((int)time(NULL), (int)t_ini);
我正在研究 Ubuntu,我想用 C 语言为汇编函数计时。
那是我的代码:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
extern void assembler_function(char*,int);
int main(){
char *text1 = "input.txt";
clock_t start=clock();
sleep(3); // used for test
//assembler_function(text1,0);
clock_t stop=clock();
//printf("%d %f\n",(int)stop,((float)stop)/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)start/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)stop/CLOCKS_PER_SEC);
printf("Time : %f \n",(double)(stop-start)/CLOCKS_PER_SEC);
return 0;
}
结果是:
时间:0.000000
时间:0.000000
时间:0.000000
如果CLOCKS_PER_SEC
是1000000
的典型值,那么您测量的范围完全有可能小于一个时钟(1微秒)。此外,除了调用本身的开销外,sleep
不会增加 clock
,因为 clock
测量的是处理时间,而不是挂钟时间。
相反,尝试测量多次调用汇编函数所花费的时间,然后将结果除以迭代次数。如果执行汇编程序函数的总时间非常小(例如 1ns),您需要巧妙地执行此操作,否则循环的开销最终可能成为测量的重要部分。
这是一个在 Ubuntu 框上编译的简单示例:
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>
int64_t timestamp_now (void)
{
struct timeval tv;
gettimeofday (&tv, NULL);
return (int64_t) tv.tv_sec * CLOCKS_PER_SEC + tv.tv_usec;
}
double timestamp_to_seconds (int64_t timestamp)
{
return timestamp / (double) CLOCKS_PER_SEC;
}
int
main ()
{
int64_t start = timestamp_now ();
sleep (1);
printf ("sleep(1) took %f seconds\n",
timestamp_to_seconds (timestamp_now () - start));
return 0;
}
来自 clock()
的有用 man
页面:
DESCRIPTION
The clock() function returns an **approximation of processor time used by the program**.
换句话说,clock()
可能不是你想要的,因为你想计算经过的挂钟时间,而不是CPU-使用时间(注意:sleep()
几乎不使用 CPU 时间 - 它只是为将来的唤醒时间设置闹钟,然后,好吧,睡觉......)。
使用差异时间:
第一个:
time_t t_ini;
t_ini=time(NULL);
最后:
difftime((int)time(NULL), (int)t_ini);