我写了一个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
。内核内部版本用于为网络数据包添加时间戳,read
、write
和 chmod
系统调用更新文件系统 inode 中的时间戳,以及类似。如果你想测量你在 gettimeofday
系统调用中花费了多少时间,你只需要做几对(越多越好)调用,一个紧接着另一个,注释它们之间的时间戳差异最后得到样本的最小值作为适当的值。这将是理想值的一个很好的近似值。
想一想,如果内核使用它来为您对文件执行的每次读取
操作添加时间戳,您就可以自由地使用它为每个服务请求添加时间戳,而不会受到严重的惩罚。
另一件事,不要使用(如其他响应所建议的那样)将 gettimeofday
结果转换为字符串的例程,因为这确实会消耗更多资源。您可以比较时间戳(假设它们是 t1
和 t2
)并且,
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/