Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 减少一天的获取时间的策略?_C++_Algorithm - Fatal编程技术网

C++ 减少一天的获取时间的策略?

C++ 减少一天的获取时间的策略?,c++,algorithm,C++,Algorithm,我编写了一个stat服务器来统计每天的访问数据,因此我必须每天清除数据库(memcached)中的数据 目前,我将调用gettimeofday来获取日期,并将其与缓存的日期进行比较,以检查是否经常存在同一天的日期 示例代码如下所示: void report_visits(...) { std::string date = CommonUtil::GetStringDate(); // through gettimeofday if (date != static_cached_dat

我编写了一个stat服务器来统计每天的访问数据,因此我必须每天清除数据库(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。而且一天的获取时间非常耗时

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

总结如下:

  • 正如你所说,检查每秒钟进行几千次
  • 你每天刷新一次缓存
  • 假设刷新的准确时间不是关键时间,可能会延迟几秒(甚至几分钟),有一个非常简单/实用的解决方案:

    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)
    ,等等<