我正在编写一个c ++基准测试程序,它涉及计时许多函数调用。重复调用这些函数,并且每次记录这些函数以便稍后进行统计分析。要求功能在多个线程上同时运行,从而确保基准测试的准确性和公平性,它在实时操作系统上运行,并且控制调度行为。以下是我的担忧:
是否有收集时间数据的确定方法?我查看了printf和stringstream,但由于内存和放大器似乎都没有确定性行为。缓冲操作。由于同样的原因,他们也没有在O(1)中表演,对吗?目前我正在使用大型char数组和自定义strcat
函数,以便可以在O(1)中收集每个时间值。然后在测试结束时打印此数组,此时已收集所有数据。
我正在使用clock_gettime
作为时间安排,clock_getres
给出了1ns的分辨率。这个值可以信任吗?
到目前为止我做得对吗,在编写基准时我还应该注意其他任何问题吗?
答案 0 :(得分:1)
调用高频定时器并将样本写入输出流是获得性能数据的一种非常明智的方法。但是有一些棘手的问题要小心。
CLOCK_PROCESS_CPUTIME_ID
)的或者,如果您确实需要100%确定性,则需要确保线程以相同的顺序安排,运行相同的量子,并将每个运行的数据放在相同的内存地址中。 / p>
答案 1 :(得分:0)
不使用big-O表示法来考虑现实生活中的问题。
对于问题的其余部分说:
性能收集需要一些时间(O(1)仍然可能是有意义的时间,只是它不依赖于您的数据)。你需要使它最有效率。
这意味着:
不要使用printf
喜欢,而是写入特殊的记忆区域,稍后您将从中提取数据。
出于同样的原因,请不要使用strcat
,而是使用struct
的二进制数据。你完成后最后解析它。
不是衡量每次通话,而是考虑衡量平均值(即:衡量不是每次通话,而是每1000次和平均值来提取单次通话的近似费用)。这将使您的测量开销时间减少。但这并非总是可行,但请考虑一下。
clock_gettime
通常可以信任,但这取决于您的操作系统和硬件 - 检查它们,有时硬件时钟分辨率可能没有您想要的那么小。