C++,从午夜开始获得毫秒的最快方法

use*_*171 3 c++ time

这是经常运行并且必须快速运行的代码,因此我想就最快的实现方式获得一些意见.注意,我实际上需要完整的毫秒分辨率到一定程度的准确度(所以秒*1000是不够的).对于这个项目,使用Boost是可以的.

编辑:目标平台是x64_86 CentOS5,也希望能够依赖OS时钟,所以我也可以在一个没有连续运行的程序中使用它.

bam*_*s53 12

C++有一个用于处理时间的计时库:

#include <chrono>
#include <iostream>
#include <ctime>

std::chrono::system_clock::duration duration_since_midnight() {
    auto now = std::chrono::system_clock::now();

    time_t tnow = std::chrono::system_clock::to_time_t(now);
    tm *date = std::localtime(&tnow);
    date->tm_hour = 0;
    date->tm_min = 0;
    date->tm_sec = 0;
    auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));

    return now-midnight;
}

int main()
{
    auto since_midnight = duration_since_midnight();

    auto hours = std::chrono::duration_cast<std::chrono::hours>(since_midnight);
    auto minutes = std::chrono::duration_cast<std::chrono::minutes>(since_midnight - hours);
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(since_midnight - hours - minutes);
    auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(since_midnight - hours - minutes - seconds);
    auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(since_midnight - hours - minutes - seconds - milliseconds);
    auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(since_midnight - hours - minutes - seconds - milliseconds - microseconds);

    std::cout << hours.count() << "h ";
    std::cout << minutes.count() << "m ";
    std::cout << seconds.count() << "s ";
    std::cout << milliseconds.count() << "ms ";
    std::cout << microseconds.count() << "us ";
    std::cout << nanoseconds.count() << "ns\n";
}
Run Code Online (Sandbox Code Playgroud)

这取决于您的实现,您获得的分辨率究竟是什么.VS 11 beta声称分辨率为100ns,但我不能说它有多精确.

11h 51m 57s 285ms 699us 600ns
Run Code Online (Sandbox Code Playgroud)

  • 我发现两次有什么区别?这会访问一次时钟,然后在time_t,tm和system_clock :: time_point之间进行一些转换.我不确定这些转换需要多长时间.提高性能的一种方法是简单地使用时钟的本机时代而不是坚持使用自午夜以来的时间; 您可以直接使用system_clock :: time_point,或稍后进行转换. (2认同)

And*_*rew -7

例如,我会尝试创建一个计时器来检查每秒的时间。如果到午夜的时间少于 K 秒:

while(True)
{
    if (checkTime() >= MIDNIGHT))
    {
        break; 
    }
}
Run Code Online (Sandbox Code Playgroud)