Windows

时间:2016-03-02 14:46:39

标签: c++ multithreading visual-c++ visual-studio-2015

似乎localtime_s()(相当于标准localtime_r)包含MSVC中的关键部分。

为了进行比较,以下是2个示例应用,其中一个在循环中localtime_s,另一个gmtime_s

分析显示来自isindst的{​​{1}}内的重锁争用:

localtime lock contention

common_localtime_s<__int64>没有出现此问题:

gmtime no lock contention

有没有办法解决这个问题,以便在多线程环境中获得理智的gmtime性能,前提是我在我的进程中需要本地时间?

2 个答案:

答案 0 :(得分:2)

以下是一个建议的解决方案:

以最快的速度记录所有时间。当通过GUI,日志文件或其他任何方式将它们呈现给用户时,转换到当地时间。

由于大多数GUI和日志输出都是单线程的,因此应该从程序的其余部分中删除争用。

如果程序永远不会向用户显示数据,那么只需以快速时间格式写出来,然后使用后处理工具进行转换或显示。

答案 1 :(得分:2)

由于标准实现使用锁并且没有简单的方法,因此您可能不得不使用不同的实现。我建议尝试将其基于GetTimeZoneInformationForYear,它将为您提供标准和DST时间以及DST活动日期的UTC偏移量。您还可以选择在您关心的每一年调用一次并缓存结果以供所有线程使用。

由于gmtime_s的表现令人满意,我建议您使用它来获取年份。 (请注意,这是localtime_s的作用。)减去GetTimeZoneInformationForYear提供的相应偏差值,然后再次使用gmtime_s将其拆分为日期组件。