缓存localtime_r()值得吗?

时间:2011-09-15 07:35:43

标签: c

是否值得保留struct tm的本地副本并仅在需要时更新它;下面的func不是线程安全的......我也看到只有6到7%的CPU时间可以保存...

struct tm* custom_localtime (time_t now_sec)
{

    static time_t cache_sec;
    static struct tm tms;

    if (now_sec != cache_sec) {
        cache_sec = now_sec;
        localtime_r(&cache_sec, &(tms));
    }

    return(&tms);
}

其他细节: - 我的应用对localtime_r()

进行超过3000次/秒的通话

当我将格式为"2011-12-09 10:32:45"的时间戳字符串再次time_t

时,发现至少节省了33%的CPU时间 谢谢所有人,asc99c和Mircea。

2 个答案:

答案 0 :(得分:1)

“避免不需要的库函数调用”是值得的。剩下的只是你在记忆和速度之间的权衡。

由于你正在调用这个3000 /秒,你可能想要更进一步,将此函数作为static inline放在标题中,并且(如果使用GCC)使用条件的分支预测提示,说明服用它“不太可能”:

if (__builtin_expect(now_sec != cache_sec, 0))

答案 1 :(得分:1)

我可能已经在你的问题中提到了3000 / s的通话费率!做吧。我最近正在分析一个屏幕的生成情况,该屏幕称本地时间约为1,000,000 * 10,000次。

嵌套循环可以通过一些思考得到大幅改进,但我看到的是大约85%的CPU时间被本地时间使用。简单地缓存结果,因此它仅被调用了10,000次,减少了85%的页面生成时间,这使得它足够快速。