看起来localtime_s()
(等同于标准的localtime_r
)在MSVC中包含一个关键部分。
为了比较,这里有两个示例应用程序,一个在循环中执行localtime_s
,另一个执行gmtime_s
。
分析显示,在common_localtime_s<__int64>
中调用的isindst
内存在严重的锁争用:
gmtime
没有表现出这个问题:
如果我需要在多线程环境中使用本地时间,有没有什么方法可以解决这个问题,以获得合理的localtime_s
性能?
看起来localtime_s()
(等同于标准的localtime_r
)在MSVC中包含一个关键部分。
为了比较,这里有两个示例应用程序,一个在循环中执行localtime_s
,另一个执行gmtime_s
。
分析显示,在common_localtime_s<__int64>
中调用的isindst
内存在严重的锁争用:
gmtime
没有表现出这个问题:
如果我需要在多线程环境中使用本地时间,有没有什么方法可以解决这个问题,以获得合理的localtime_s
性能?
gmtime
。但是我还通过复制 MS CRT 实现并将所有 static
变量更改为 thread_local
(当然还删除了锁)来实现了 localtime_lockfree
。不幸的是,由于 MSCRT 许可证禁止共享修改后的源代码,我无法分享结果代码 :( - rustyxGetTimeZoneInformationForYear
进行实现,该实现会为您提供标准时间和夏令时的UTC偏移量以及夏令时生效期间的日期。您还可以选择为您关心的每一年调用此函数并缓存结果,以供所有线程使用。gmtime_s
的性能表现良好,我建议您使用它来获取年份。(请注意,这就是 localtime_s
所做的。)减去 GetTimeZoneInformationForYear
提供的适当 Bias 值,然后再次使用 gmtime_s
将其拆分为日期组件。GetTimeZoneInformation
),因此用这种方式实际上可能更准确。顺便说一下,CRT 实现还支持 TZ
环境变量作为覆盖。 - rustyx
gmtime
和localtime
计算偏移量,然后将该偏移量应用于gmtime
返回的时间? - NathanOliver_localtime64_s
也调用__tzset
,它也需要许多锁,所以我敢打赌,即使您绕过了_isindst
,这些锁仍然会有所影响。 - Dark Falconlocaltime
根据输入的时间戳计算偏移量。如果输入处于DST中,则会添加DST偏移量。我没有看到通过固定偏移量轻松解决这个问题的方法。 - rustyx