【发布时间】:2016-03-02 14:46:38
【问题描述】:
似乎localtime_s()(相当于标准localtime_r)在MSVC 中包含一个临界区。
为了比较,这里有 2 个示例应用,一个在循环中执行 localtime_s,另一个在循环中执行 gmtime_s。
分析显示从common_localtime_s<__int64> 调用的isindst 内部存在严重的锁争用:
gmtime 没有出现问题:
如果我的进程确实需要本地时间,是否有任何方法可以解决此问题以在多线程环境中获得稳定的localtime_s 性能?
【问题讨论】:
-
你真的经常调用这个函数以至于它是一个瓶颈吗?
-
是的,它目前占用了所有已用时间的 70%(64 个 CPU)。
-
是的,我也遇到过同样的问题。 localtime_s 在多线程环境中很慢。我无法找到解决方案。
-
锁保护了一些用于缓存DST计算结果的静态变量。你对此无能为力。如果您无法按照建议处理偏移量,您可能必须使用转换的替代实现。请注意,
_localtime64_s也调用了__tzset,它也需要一些锁,所以我敢打赌,即使你在_isindst周围工作,它们仍然会咬你一些。 -
但是
localtime根据输入时间戳计算偏移量。如果输入位于 DST 中,则它会添加 DST 偏移量。没有一种简单的方法可以使用固定偏移量来解决这个问题。
标签: c++ multithreading visual-c++ visual-studio-2015