似乎localtime_s()
(相当于标准localtime_r
)包含MSVC中的关键部分。
为了进行比较,以下是2个示例应用,其中一个在循环中localtime_s
,另一个gmtime_s
。
分析显示来自isindst
的{{1}}内的重锁争用:
common_localtime_s<__int64>
没有出现此问题:
有没有办法解决这个问题,以便在多线程环境中获得理智的gmtime
性能,前提是我在我的进程中需要本地时间?
答案 0 :(得分:2)
以下是一个建议的解决方案:
以最快的速度记录所有时间。当通过GUI,日志文件或其他任何方式将它们呈现给用户时,转换到当地时间。
由于大多数GUI和日志输出都是单线程的,因此应该从程序的其余部分中删除争用。
如果程序永远不会向用户显示数据,那么只需以快速时间格式写出来,然后使用后处理工具进行转换或显示。
答案 1 :(得分:2)
由于标准实现使用锁并且没有简单的方法,因此您可能不得不使用不同的实现。我建议尝试将其基于GetTimeZoneInformationForYear
,它将为您提供标准和DST时间以及DST活动日期的UTC偏移量。您还可以选择在您关心的每一年调用一次并缓存结果以供所有线程使用。
由于gmtime_s
的表现令人满意,我建议您使用它来获取年份。 (请注意,这是localtime_s
的作用。)减去GetTimeZoneInformationForYear
提供的相应偏差值,然后再次使用gmtime_s
将其拆分为日期组件。