c++ - 减少gettimeofday时间的策略?

标签 c++ algorithm

我写了一个stat server来统计每天的访问数据,所以我每天都要清理db(memcached)中的数据。

目前,我会调用 gettimeofday 获取日期,并将其与缓存的日期进行比较,以检查是否经常有同一天。

示例代码如下:

void report_visits(...) {
   std::string date = CommonUtil::GetStringDate(); // through gettimeofday
   if (date != static_cached_date_) {
       flush_db_date();
       static_cached_date_ = date;
   }
}

问题是我必须每次调用gettimeofday客户端报告访问信息。而且 gettimeofday 比较耗时。

这个问题有什么解决办法吗?

最佳答案

gettimeofday 系统调用(现在已过时,取而代之的是 clock_gettime)是执行时间最短的系统调用之一。我上次测量是在 Intel i486 上,持续了大约 2us。内核内部版本用于为网络数据包添加时间戳,readwritechmod 系统调用更新文件系统 inode 中的时间戳,以及类似。如果你想测量你在 gettimeofday 系统调用中花费了多少时间,你只需要做几对(越多越好)调用,一个紧接着另一个,注释它们之间的时间戳差异最后得到样本的最小值作为适当的值。这将是理想值的一个很好的近似值。

想一想,如果内核使用它来为您对文件执行的每次读取 操作添加时间戳,您就可以自由地使用它为每个服务请求添加时间戳,而不会受到严重的惩罚。

另一件事,不要使用(如其他响应所建议的那样)将 gettimeofday 结果转换为字符串的例程,因为这确实会消耗更多资源。您可以比较时间戳(假设它们是 t1t2)并且,

gettimeofday(&t2, NULL);
if (t2.tv_sec - t1.tv_sec > 86400) {  /* 86400 is one day in seconds */
    erase_cache();
    t1 = t2;
} 

或者,如果您希望它在每天的同一时间发生

gettimeofday(&t2, NULL);
if (t2.tv_sec / 86400 > t1.tv_sec / 86400) {
    /* tv_sec / 86400 is the number of whole days since 1/1/1970, so
     * if it varies, a change of date has occured */
    erase_cache();
}
t1 = t2; /* now, we made it outside, so we tie to the change of date */

甚至,你可以为此使用 time() 系统调用,因为它有第二个分辨率(你不需要处理 usecs 或 的开销struct timeval 结构)。

关于c++ - 减少gettimeofday时间的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31695775/

相关文章:

c++ - 了解局部和全局变量 : C++

c++ - 为什么访问嵌套类型会影响 C++ 中的成员解析?

c++ - 使用带有网络摄像头的 FFmpeg 编码和 UDP

c++ - 如何在 C++ 中的矩阵中搜索 vector 以及使用哪种算法?

c++ - 这个检测循环链表的函数的时间复杂度是多少?

algorithm - 从矩阵的每一行和每一列中准确挑选出一个值

c++ - open() 中的正确路径

c++ - 以编程方式设置标题栏和边框颜色

python - 距起始顶点一定距离内的顶点数

algorithm - 动态最大流量计算的最佳图形算法/实现