我需要知道如何以纳秒为单位计算C代码中函数的时间。
我试着重复这个功能直到消耗几微秒。 time.h
中是否还有其他函数可用于计算以纳秒为单位的时间?
答案 0 :(得分:9)
你永远不会达到纳秒精度。想想你在问什么:在1 GHz CPU 1纳秒是一个时钟周期。无论你试图打电话,你永远不会得到那种准确性,你最好坚持微秒。这里有许多例子的类似问题:C++ Cross-Platform High-Resolution Timer。
仅适用于c:在Windows上您要使用QueryPerformanceCounter。 QPC还有更多内容。 Here是关于如何使用QueryPerformanceCounter的相关问题。
答案 1 :(得分:1)
无论您如何处理此问题或使用何种类型的系统/操作系统,您都会获得最佳答案,但由于问题的性质存在相当大的差异。
其次,您需要一个支持此类呼叫的系统。如果你正在使用QNX Neutrino,这很容易:
http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html
/*
* 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;
}
答案 2 :(得分:0)
标准C中的clock
函数对此无用。它通常具有可怕的分辨率,并且它(在平台之间)是否不一致(无论是测量经过的时间还是消耗的cpu时间)。您应该使用POSIX标准clock_gettime
函数(具有纳秒分辨率并允许您指定要测量的时钟)并使用缺少POSIX函数的平台上可用的任何特定于系统的时钟操作来模拟它。
答案 3 :(得分:0)
调用该函数足以让您获得秒内的总时间,并使用任何方法进行测量(即使是纯C时钟())。以微/纳秒为单位测量本质上是不精确的。
对于基准测试,您需要QueryPerformanceCounter。它是Windows上最好的秒表。请参阅:How to use QueryPerformanceCounter?但是使用它来衡量(例如)单个函数调用仍然是非常不精确的;我认为您需要按照第二次总计的时间来获得测量的良好信噪比。对您想要的任何持续时间进行多次测量,并将它们的值与标准偏差进行比较,以确保您的测量结果足够准确。
Multimedia Timers可能是最好的时钟(注意时钟和秒表之间的差异:一个测量绝对时间,其他时间间隔仅适用于Windows)。使用timeGetTime()。
,您应该能够获得接近毫秒的分辨率和精度