让我们说我想衡量一个特定功能的总时间。现在这个函数调用其他函数(f1和f2)。所以我想计算f1和f2的总时间。
我期待的是f total time = f1 total time + f2 total time
void f(){
struct timespec total_start, total_end;
struct timespec f1_start, f1_end;
struct timespec f2_start, f2_end;
clock_gettime(CLOCK_MONOTONIC, &total_start);
clock_gettime(CLOCK_MONOTONIC, &f1_start);
f1();
clock_gettime(CLOCK_MONOTONIC, &f1_end);
clock_gettime(CLOCK_MONOTONIC, &f2_start);
f2();
clock_gettime(CLOCK_MONOTONIC, &f2_end);
clock_gettime(CLOCK_MONOTONIC, &total_end);
f_total_time = (total_end.tv_sec - total_start.tv_sec) + (total_end.tv_nsec - total_start.tv_nsec)/1e9 ;
f1_total_time = (f1_end.tv_sec - f1_start.tv_sec) + (f1_end.tv_nsec - f1_start.tv_nsec)/1e9 ;
f2_total_time = (f2_end.tv_sec - f2_start.tv_sec) + (f2_end.tv_nsec - f2_start.tv_nsec)/1e9 ;
}
我的问题是,这是衡量函数内部函数时间的正确方法吗?
问题:我面临的问题是f1的总时间,而f2不等于f的总时间。即f total time != f1 total time + f2 total time
实际发生的是f total time > f1 total time + f2 total time
我做错了吗?
答案 0 :(得分:0)
要计算C ++应用程序,请记录变量中的初始时间,并声明持续时间(秒):
#include "time.h"
clock_t t (clock ());
size_t duration (0);
在执行期间,持续时间以这种方式更新:
duration = (clock() - t)/CLOCKS_PER_SEC;
答案 1 :(得分:0)
回答 -
是。恕我直言,它似乎是一种有效的持续时间测量技术 函数中的函数。
Posix clock_gettime()报告固定的秒/纳秒 时间,所以每次访问都是独立的。
来自" man clock_gettime" :
所有实现都支持系统范围的实时时钟, 由CLOCK_REALTIME标识。它的时间代表着 自纪元以来的秒和纳秒。什么时候到了 改变了,相对间隔的计时器不受影响,但是 绝对时间点的计时器会受到影响。
我认为你的做法没有错。
也许你需要了解更多关于你的相对持续时间的信息 代码与您正在使用的时钟读取机制的持续时间。
在我的Ubuntu 15.10上,在较旧的戴尔上,使用g ++ 5.2.1,Posix 调用
clock_gettime(CLOCK_REALTIME, ...)
使用> 1,500 ns(平均3秒)(即约1.5 us)
为了达到一定程度的重复性,你的持续时间 试图测量(f1()和f2()和f1()+ f2())必须大于 这可能是10倍。
您的系统将与我的系统不同,因此您必须对其进行测试 知道这些时钟读取需要多长时间。
还有一个有趣的想法,知道有多快 CLOCK_REALTIME递增。即使API指示 纳秒,它可能不会那么快。
我使用的替代方法是std :: time(nullptr),成本约为5 ns(在我的系统上),减少3个数量级。仅供参考::: time(0)测量相同。
由此API返回控制的循环最后才会启动 一秒钟,当返回的值从以前改变时 值。我通常累积3秒的循环(即固定的 测试时间)并计算平均事件持续时间。
测量输出示例:
751.1412070 M 'std::time(nullptr) duration' invocations in 3.999,788 sec (3999788 us)
187.7952549 M 'std::time(nullptr) duration' events per second
5.324948176 n seconds per 'std::time(nullptr) duration' event
如果使用此时钟访问,您可以简单地减去5.3 ns(在我的 系统)从每次调用时计算每个事件的秒数 你的职能。
注意:任何Posix API都是提供的系统的接口 功能,而不是功能本身。
成为API的一部分并不是关于该问题的确凿证据 函数实现...可以是任何语言, 甚至可以达到最佳性能。