我需要知道如何在C代码中计算函数的时间,单位为纳秒。
我尝试重复函数直到消耗一些微秒。 time.h
中是否有其他函数可用于以纳秒为单位计算时间?
我需要知道如何在C代码中计算函数的时间,单位为纳秒。
我尝试重复函数直到消耗一些微秒。 time.h
中是否有其他函数可用于以纳秒为单位计算时间?
/*
* This program calculates the time required to
* execute the program specified as its first argument.
* The time is printed in seconds, on standard out.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define BILLION 1000000000L;
int main( int argc, char** argv )
{
struct timespec start, stop;
double accum;
if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
system( argv[1] );
if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
accum = ( stop.tv_sec - start.tv_sec )
+ (double)( stop.tv_nsec - start.tv_nsec )
/ (double)BILLION;
printf( "%lf\n", accum );
return EXIT_SUCCESS;
}
标准C语言中的clock
函数对此并不有用。它通常具有可怕的分辨率,并且在不同平台之间不一致,无论它测量经过的墙上时间还是消耗的CPU时间。您应该使用POSIX标准的clock_gettime
函数(它具有纳秒分辨率,并允许您指定要针对哪个时钟进行测量),并使用在缺乏POSIX函数的平台上可用的任何系统特定的时钟操作来模拟它。
调用函数足够多次,以获取总时间(秒),并使用任何方法进行测量(即使是普通的C clock())。以微秒/纳秒为单位测量固有地过于不精确。
对于基准测试,您需要QueryPerformanceCounter。这是Windows上可用的最佳秒表。请参见:如何使用QueryPerformanceCounter?但是,即使使用此方法来测量(例如)单个函数调用,仍然会固有非常不精确;我认为您需要计时约一秒钟才能获得良好的信噪比来进行测量。进行多个持续时间的测量,并将它们的值与其标准偏差进行比较,以确保您正在进行足够准确的测量。
多媒体定时器可能是Windows上最好的时钟(注意时钟和秒表之间的区别:一个测量绝对时间,另一个仅测量时间间隔)。您应该能够使用timeGetTime()获得接近毫秒级的分辨率和精度。
timespec_get
将能够做到这一点:https://dev59.com/jHRC5IYBdhLWcg3wP-n5#36095407。关于Linux版本的问题,请参见https://dev59.com/bmQo5IYBdhLWcg3wKcrH。 - Ciro Santilli OurBigBook.com