C++ 减少一天的获取时间的策略?
我编写了一个stat服务器来统计每天的访问数据,因此我必须每天清除数据库(memcached)中的数据 目前,我将调用gettimeofday来获取日期,并将其与缓存的日期进行比较,以检查是否经常存在同一天的日期 示例代码如下所示:C++ 减少一天的获取时间的策略?,c++,algorithm,C++,Algorithm,我编写了一个stat服务器来统计每天的访问数据,因此我必须每天清除数据库(memcached)中的数据 目前,我将调用gettimeofday来获取日期,并将其与缓存的日期进行比较,以检查是否经常存在同一天的日期 示例代码如下所示: void report_visits(...) { std::string date = CommonUtil::GetStringDate(); // through gettimeofday if (date != static_cached_dat
void report_visits(...) {
std::string date = CommonUtil::GetStringDate(); // through gettimeofday
if (date != static_cached_date_) {
flush_db_date();
static_cached_date_ = date;
}
}
问题是每次客户报告访问信息时,我都必须调用gettimeofday。而且一天的获取时间非常耗时
这个问题有什么解决办法吗?总结如下:
void report_visits(...)
{
static unsigned int counter;
if ((counter++ % 1000) == 0)
{
std::string date = CommonUtil::GetStringDate();
if (date != static_cached_date_)
{
flush_db_date();
static_cached_date_ = date;
}
}
}
只要在调用report\u visions()
时每N次检查一次。在上面的例子中,N是1000
。每秒钟多达数千次检查,您将迟到不到一秒(或一天的0.001%)
不要担心计数器
环绕,它在大约20多天内只发生一次(假设最多几千次检查/s,使用32位int
),并且不会造成伤害。总结如下:
void report_visits(...)
{
static unsigned int counter;
if ((counter++ % 1000) == 0)
{
std::string date = CommonUtil::GetStringDate();
if (date != static_cached_date_)
{
flush_db_date();
static_cached_date_ = date;
}
}
}
只要在调用report\u visions()
时每N次检查一次。在上面的例子中,N是1000
。每秒钟多达数千次检查,您将迟到不到一秒(或一天的0.001%)
不要担心
计数器
wrap-around,它在大约20多天内只发生一次(假设最多几千次检查/s,使用32位int
),并且不会造成伤害。要执行的最短系统调用中包括gettimeofday
系统调用(现在已经过时,支持clock_gettime
)。我最后一次测量是在Intel i486上进行的,持续时间约为2us
。内核内部版本用于给网络数据包加时间戳、读
、写
、和chmod
系统调用以更新文件系统inode中的时间戳等。如果您想测量在gettimeofday
系统调用中花费的时间,您只需执行几对(越多越好)调用,一对接一对地执行,注释它们之间的时间戳差异,并最终获得样本的最小值作为正确值。这将是理想值的一个很好的近似值
试想一下,如果内核使用它为您对文件执行的每个read
操作添加时间戳,那么您可以自由地使用它为每个服务请求添加时间戳,而不会受到严重的惩罚
另一件事,不要使用(正如其他响应所建议的)例程将gettimeofday
结果转换为字符串,因为这确实会消耗更多的资源。您可以比较时间戳(假设它们是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
结构的开销)。系统调用gettimeofday
系统调用(现在已经过时,取而代之的是clock\u gettime
)是要执行的最短系统调用之一。我最后一次测量是在Intel i486上进行的,持续时间约为2us
。内核内部版本用于给网络数据包加时间戳、读
、写
、和chmod
系统调用以更新文件系统inode中的时间戳等。如果您想测量在gettimeofday
系统调用中花费的时间,您只需执行几对(越多越好)调用,一对接一对地执行,注释它们之间的时间戳差异,并最终获得样本的最小值作为正确值。这将是理想值的一个很好的近似值
试想一下,如果内核使用它为您对文件执行的每个read
操作添加时间戳,那么您可以自由地使用它为每个服务请求添加时间戳,而不会受到严重的惩罚
另一件事,不要使用(正如其他响应所建议的)例程将gettimeofday
结果转换为字符串,因为这确实会消耗更多的资源。您可以比较时间戳(假设它们是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
结构的开销)。(这是一个老问题,但缺少一个重要的答案:)
您需要定义TZ
环境变量并将其导出到程序中。如果未设置,您将调用/etc/localtime
。。。对于每次调用gettimeofday(2)
,localtime(3)
,等等
当然,这些问题将在不访问磁盘的情况下得到回答,但是调用的频率和系统调用的开销足以在某些情况下产生明显的差异
证明文件:
(这是一个老问题,但缺少一个重要的答案:)
您需要定义TZ
环境变量并将其导出到程序中。如果未设置,您将调用/etc/localtime
。。。对于每次调用gettimeofday(2)
,localtime(3)
,等等<