提问者:小点点

C代码中以纳秒为单位计算函数时间


我需要知道如何才能计算C代码中一个函数的时间,以纳秒为单位。我试着重复这个功能,直到消耗一些微秒。中是否还有其他函数可以用来计算以纳秒为单位的时间?


共3个答案

匿名用户

你永远不可能得到纳秒级的精确度。想想你在问什么:在1 GHz的CPU上,1纳秒是一个时钟周期。无论你试图调用什么,你永远不会得到那样的精确度,你最好坚持在微秒。这里有一个例子很多的类似问题:C++跨平台高分辨率定时器。

仅适用于c语言:在windows上,您希望使用QueryPerformanceCounter。下面是关于QPC的更多内容。这里有一个关于如何使用QueryPerformanceCounter的相关问题。

匿名用户

不管您如何处理这个问题,也不管您使用的是哪种类型的System/OS,您最多只能得到一个近似的答案,由于问题的性质,会有相当大的差异。

第二,你需要一个支持这种调用的系统。如果你使用QNX中微子,这很容易:

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中的函数对此并不有用。它通常有可怕的分辨率和它的不一致(在平台之间),无论它测量流逝的墙壁时间或cpu时间消耗。您应该使用POSIX-standard函数(该函数具有纳秒分辨率,允许您指定要测量的时钟),并在缺少POSIX函数的平台上使用任何特定于系统的时钟操作来仿真该函数。