我需要知道如何在C代码中以纳秒为单位计算函数的时间。 我试图重复该function,直到消耗一些微秒。 time.h
中是否有其他的函数可以用来计算纳秒的时间?
你永远不会得到纳秒级的精度。 想想你在问什么:在1GHz的CPU上1纳秒是一个时钟周期。 无论你试图打电话,你永远不会得到那种准确性,你最好坚持几微秒。 有很多例子的类似问题在这里: C ++跨平台高分辨率定时器 。
仅适用于c:在要使用QueryPerformanceCounter的窗口上。 QPC更多。 以下是有关如何使用QueryPerformanceCounter的相关问题。
不管你如何处理这个问题,或者你正在使用的是什么类型的系统/操作系统,你最好都会得到一个近似的答案,由于问题的性质而有相当大的差异。
其次,你需要一个支持这种呼叫的系统。 如果您使用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; }
标准C中的clock
功能对此没有用处。 它通常具有可怕的解决方案,并且在平台之间是不一致的,无论是测量墙壁耗时还是CPU消耗时间。 您应该使用POSIX标准的clock_gettime
函数(它具有纳秒级分辨率,可以指定要测量的时钟),并使用在缺少POSIX函数的平台上可用的任何特定于系统的时钟操作进行仿真。
调用函数足够多的时间,以秒为单位获得总时间,并使用任何方法来测量(即使是纯C时钟())。 以微米/纳秒为单位的测量本质上太不精确。
对于基准测试,您需要QueryPerformanceCounter 。 这是Windows上最好的秒表。 请参阅: 如何使用QueryPerformanceCounter? 然而,使用它来衡量(例如)一个单一的函数调用仍然是非常不精确的; 我认为你需要在第二个数量级的时间,以获得良好的信噪比为您的测量。 对您想要的任何时间进行多次测量,并将其值与标准偏差进行比较,以确保您的测量准确度足够高。
多媒体计时器可能是最好的时钟(注意时钟与秒表的区别:一个是绝对时间,另一个是时间间隔)可用在Windows上。 您应该能够通过timeGetTime ()获得接近毫秒的分辨率和精度。