【问题标题】:Measuring the maximum and minimum execution time of a specific function测量特定函数的最大和最小执行时间
【发布时间】:2023-03-04 01:22:01
【问题描述】:

我正在做一些简单的基准测试,使用两种方法将 x 行相同的文本写入文件:

  1. 直接写入。

  2. 创建一个新线程并通过异步队列完成通信(主线程在一侧插入,另一个线程从另一侧读取)。此方法用于尽量减少最慢的写入(由于刷新)

这是一个sn-p代码,应该给出程序的基本概念:

int i;
char * buf;
int buf_size;
double local_start, local_end, global_start, global_end;
double slowest, fastest;
double local_time_difference;

buf = "A string to be printed to a file \n";
buf_size = strlen(buf);
fastest = MAX_WRITE_TIME;
slowest = 0;

logger_init(atoi(argv[1]));


global_start = get_time();
for(i = 0 ; i < 100000000 ; i++) 
{
    local_start = get_time();
    logger_write(buf, buf_size);
    local_end = get_time();

    local_time_difference = local_end-local_start;

    if(local_time_difference < fastest && local_time_difference != 0)
        fastest = local_time_difference;

    if(local_time_difference > slowest)
        slowest = local_time_difference;

    if(i % 10000 == 0)
        usleep(1);
}   
global_end = get_time();



printf("Fastest: %1.9f\nSlowest: %1.9f\nTotal Time: %1.9f\n", fastest, slowest, global_end-global_start);
logger_destroy();

获取时间过程以微秒为单位返回时间

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

根据传递给 logger_init 的参数,logger_write 将直接写入文件或将其插入队列中(队列大小不得超过某些特定限制)。 GAsyncQueue 正在使用中

我目前用来计算最快和最慢写入的方法确实有效,但我的问题是:是否有工具或分析器可以为我做到这一点?即给我关于每个函数的统计数据(最大、最小和平均调用)

到目前为止我尝试过但没有成功的工具:

  • gprof
  • 缩放
  • Kcachegrind
  • VTune

TL:DR 我正在寻找一种工具来提供特定函数的最小、最大和平均执行时间,而不是总时间。

【问题讨论】:

  • 您可以使用更高分辨率的时间函数获得更好的准确性,例如clock_gettime(假设是linux)或windows上的QueryPerformanceCounter

标签: c profiling performance


【解决方案1】:
  • 使用正确的高分辨率 OS API 函数进行基准测试。
  • 不要从测量本身内部计算执行时间,尤其是如果您使用浮点数。
  • 为什么要调用睡眠函数?您是在尝试强制进行上下文切换还是类似的怪事?操作系统可能会比您的程序处理得更好、更高效。

【讨论】:

  • 我使用了clock_gettime,但由于某种原因,我复制了错误的版本。你可以看到我正在打印到第九个浮点数。关于您的第二点,您是否建议我将结果存储在数据结构(两个数组?)中并在外面进行计算?至于睡眠,我试图模拟一个真实世界的例子(降低接收消息的速度)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多