我希望在同一运行线程中选择的时间点永远不相等。这是因为我使用时间点来区分不同的计算结果。
伪代码:
StampedResult fn() {
auto result = Calculations();
auto time_stamp = std::chrono::steady_clock::now();
return {time_stamp, result);
}
现在,如果Calculations()
总是很复杂,那将自动解决。但有时Calculations()
可能会立即返回。
所以,我想我应该检查对steady_clock::now()
的2个连续调用是否可以返回相同的值,如下所示:
https://onlinegdb.com/BkiDAZRe8
在onlinegdb.com
和笔记本电脑Intel® Core™ i7-8750H CPU @ 2.20GHz
上,我从未得到相同的返回值。但是给定steady_clock
的纳秒精度,其他超高频处理器是否可以实际返回相同的值?
是否确保2个连续的std :: chrono :: steady_clock :: now()不相等?
标准不保证。引用最新草稿:
[time.clock.steady]
steady_clock类的对象表示这样的时钟,对于这些时钟,time_point的值不会随着物理时间的增长而减少,并且time_point的值相对于实时以稳定的速率增长。也就是说,时钟可能无法调整。
保持不变满足“永不减少”的要求。
时钟具有有限的粒度,并且如果粒度小于对now
的调用频率,则从理论上讲两个调用之间的值保持相同是可行的。对于相同的值再次出现,呼叫的复杂性是实际的限制,但这是偶然的。
如果您希望避免重复值,那么可以通过存储最后一个时间戳来切实可行地避免这种可能性。如果新的一个等于或小于旧的,则将新的一个微调一个度量单位。如果存在三个相等的值,则“较少”部分成为可能,因此第二个值被推到第三个值之后。
steady_clock
必须不向后移动,并且需要以规则的间隔向前移动。而已。甚至不需要具有纳秒级的精度(或时钟的实际精度以匹配其时间点的精度)。
对于您正在做的事情,使自己的内部计数器在每次计算时都会增加,这是一个更好的选择。
没有无法保证两个调用不会返回相同的值。
如果您设法在其分辨率内多次查询时钟,则会多次获得相同的结果。发生这种情况的可能性取决于您查询的时钟,但总是一种可能性。
简而言之;您cannot使用时间戳作为唯一标识符。如果未重新使用线程ID,您可能可以使用“时间戳+ thread_id”。最好先按时间戳排序,然后再按创建时分配给每个线程的单调递增ID排序。这样可以保证唯一性并建立固定的排序顺序。