【发布时间】:2019-01-30 10:12:11
【问题描述】:
我写了一些东西来测量我的代码运行和打印出来的时间。我现在拥有它的方式支持这些测量值的嵌套。
事情是,在获取时间间隔,将其转换为数字,获取时间格式,然后将所有内容转换为字符串,然后将其打印出来的过程中需要一段时间(2-3毫秒),我/O 似乎特别昂贵。我希望时钟在某种意义上“跳过”这个过程,因为我正在测量的东西会以微秒为单位。 (而且我认为这将是一个很好的功能,如果我还有其他想要跳过的内容)
std::chrono::high_resolution_clock clock;
std::chrono::time_point<std::chrono::steady_clock> first, second;
first = clock.now();
std::chrono::time_point<std::chrono::high_resolution_clock> paused_tp = clock.now();
std::cout << "Printing things \n";
clock.setTime(paused_tp); // Something like this is what I want
second = clock.now();
这个想法是确保first 和second 有最小的差异,最好是相同的。
据我所知,high_resolution_clock 类(以及所有其他 chrono 时钟)保持其 time_point 私有,您只能从 clock.now() 访问它
我知道那里可能有执行此操作的基准测试库,但我想自己弄清楚如何做(如果只是为了知道如何做)。任何有关其他库如何做到这一点的信息或有关 chrono 如何工作的见解也将不胜感激。我可能误解了chrono 内部如何跟踪。
(std::chrono::high_resolution_clock 对于这样的事情是否足够准确?)
(虽然我在这里,但任何有关使 C++ 程序更高效的资源都会很棒)
编辑:我实际上是在我尝试计时的代码部分之后进行打印,例如,当我想对整个程序以及单个函数计时时,才会出现问题。那么函数时间的打印会导致整个程序时间的延迟。
编辑 2:我想我应该有更多的例子来说明我在做什么。
我有一个可以处理所有事情的类,比如说它叫做tracker,它负责处理所有的时钟问题。
tracker loop = TRACK(
for(int i = 0; i != 100; ++i){
tracker b = TRACK(function_call());
b.display();
}
)
loop.display();
宏是可选的,它只是一个快速的东西,使它不那么混乱,并允许我显示被调用的函数的名称。
将宏显式扩展为
tracker loop = "for(int i = 0; i != 100; ++i){ tracker b = TRACK(function_call()); b.display(); }"
loop.start()
for(int i = 0; i != 100; ++i){
tracker b = "function_call()"
b.start();
function_call();
b.end();
b.display();
}
loop.end();
loop.display();
在大多数情况下,打印不是问题,它只跟踪start() 和end() 之间的内容,但这里b.display() 最终会干扰tracker loop。
我的一个目标是让跟踪器尽可能不打扰,所以我希望大部分/全部都在跟踪器类中处理。但后来我遇到了b.display() 是与tracker loop 不同实例的方法的问题。我用static 关键字尝试了一些事情,但遇到了一些问题(仍在尝试)。我可能在这里把自己编码到了死胡同,但还有很多事情要尝试。
【问题讨论】:
-
smth like: `std::chrono::time_point<:chrono::steady_clock> first2 = clock.now(); std::cout second2 = clock.now();第一个+=第二个2-第一个2; `
标签: c++ clock chrono benchmarking