以纳秒为单位计算函数时间

11

我需要知道如何在C代码中计算函数的时间,单位为纳秒。

我尝试重复函数直到消耗一些微秒。 time.h 中是否有其他函数可用于以纳秒为单位计算时间?


纳秒级别的准确性最多只能高度依赖于平台。是Windows/Linux/嵌入式系统等哪个平台? - Steve Fallows
不,而且测量单个函数调用也没有太大的用处。你可以使用clock()。 - Cubic
2
如果你正在使用Linux,那么需要注意的是,Linux并不是一个实时平台,其调度器的时间刻度为毫秒级别。 - MOHAMED
1
尝试对程序进行分析以获取每个函数的相对时间。 - 1-----1
1
当C11可用时,timespec_get将能够做到这一点:https://dev59.com/jHRC5IYBdhLWcg3wP-n5#36095407。关于Linux版本的问题,请参见https://dev59.com/bmQo5IYBdhLWcg3wKcrH。 - Ciro Santilli OurBigBook.com
这回答您的问题了吗?如何以毫秒分辨率获取Windows系统时间? - phuclv
4个回答

12
你永远不可能获得纳秒级的准确度。想想你在请求什么:在1 GHz CPU上,1纳秒就是一个时钟周期。无论你尝试调用什么,你都永远不会获得那种准确度,最好坚持使用微秒。这里有一个类似的问题并附有许多示例:C++跨平台高分辨率计时器
对于C语言:在Windows上,你要使用QueryPerformanceCounter。这里还有更多关于QPC的内容。这里有一个相关的问题,关于如何使用QueryPerformanceCounter。

timespec_get从C11返回的时间可以精确到纳秒级别,取决于实现的分辨率。请访问https://dev59.com/bmQo5IYBdhLWcg3wKcrH#36095783进行了解。 - Efreeto
@efreet,我并没有说你不能获得纳秒级的返回值,我是说它不准确,因此与毫秒级的返回值一样无用。 - chacham15

3
无论你采取何种方法,或使用哪种类型的系统/操作系统,你最多只能获得一个近似答案,由于这个问题的本质而存在相当大的差异。
其次,你需要一个支持这种调用的系统。如果你使用的是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;
  }

1

标准C语言中的clock函数对此并不有用。它通常具有可怕的分辨率,并且在不同平台之间不一致,无论它测量经过的墙上时间还是消耗的CPU时间。您应该使用POSIX标准的clock_gettime函数(它具有纳秒分辨率,并允许您指定要针对哪个时钟进行测量),并使用在缺乏POSIX函数的平台上可用的任何系统特定的时钟操作来模拟它。


请注意,“纳秒分辨率”和“纳秒精度”之间存在差异。此外,他想要一个Windows解决方案,而这不是(抱歉,他在评论中提到了它,我只是添加了标签)。 - chacham15

0

调用函数足够多次,以获取总时间(秒),并使用任何方法进行测量(即使是普通的C clock())。以微秒/纳秒为单位测量固有地过于不精确。

对于基准测试,您需要QueryPerformanceCounter。这是Windows上可用的最佳秒表。请参见:如何使用QueryPerformanceCounter?但是,即使使用此方法来测量(例如)单个函数调用,仍然会固有非常不精确;我认为您需要计时约一秒钟才能获得良好的信噪比来进行测量。进行多个持续时间的测量,并将它们的值与其标准偏差进行比较,以确保您正在进行足够准确的测量。

多媒体定时器可能是Windows上最好的时钟(注意时钟和秒表之间的区别:一个测量绝对时间,另一个仅测量时间间隔)。您应该能够使用timeGetTime()获得接近毫秒级的分辨率和精度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接