以纳秒为单位获取当地时间

时间:2012-10-17 15:36:02

标签: c++ boost time benchmarking

  

可能重复:
  C++ Timer function to provide time in nano seconds

我需要以纳秒分辨率来衡量函数执行的持续时间。可能吗?我们普通的计算机硬件和软件能够给出如此精确的时间吗?如果是,如何使用c ++实现这一目标?是否可以使用Boost库?

4 个答案:

答案 0 :(得分:42)

是的,今天大多数硬件都支持这种解决方案,而C ++标准库也有一个支持它的API。不幸的是,并非所有C ++实现都能提供它。

API是C ++ 11中引入的<chrono>库:

#include <iostream>
#include <chrono>

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    // operation to be timed ...

    auto finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
}

libc ++中针对Darwin的<chrono>实现提供了纳秒分辨率,但似乎VS2012中的实现仅达到十分之几毫秒。上面的代码仍将以纳秒为单位给出时间,但小于100微秒的时间将最终为零纳秒。

Boost还提供了一个实现,boost :: chrono,它似乎在Windows上使用纳秒。它也适用于C ++ 03。

#include <boost/chrono.hpp>

int main() {
    boost::chrono::high_resolution_clock::time_point t1 =
        boost::chrono::high_resolution_clock::now();

    boost::chrono::high_resolution_clock::time_point t2 =
        boost::chrono::high_resolution_clock::now();

    std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
    // boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}

答案 1 :(得分:3)

关于使用Windows API可以做的最好的事情是QueryPerformanceCounter。您可以使用QueryPerformanceFrequency获取其分辨率。根据具体情况,可以使用CPU的RDTSC指令,在这种情况下,频率基本上是CPU的时钟频率。在其他情况下,它使用频率为1.024 MHz的独立时钟,因此分辨率基本上为1微秒。

C ++ 11添加了一个chrono类,它也可能很有用 - 假设您正在使用已经拥有它的编译器。如果您的编译器没有提供实现,Boost Chrono是一个合理的替代品,适用于大多数现有的编译器/库。同样,不能保证它会提供纳秒分辨率,但我希望在Windows上它可能是QPC / QPF的便携式包装器,所以它可能会提供相同的分辨率,只是更便携。

答案 2 :(得分:2)

我不确定你是在寻找时钟还是时差,但其中一个应该是你想要的:

http://www.cplusplus.com/reference/clibrary/ctime/clock/

http://www.cplusplus.com/reference/clibrary/ctime/difftime/

您可以在函数之前和之后使用它,并比较运行时的差异以查看函数的整体运行时。

答案 3 :(得分:0)

当然还有好老Boost::date_time

#include <boost/date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
但是,

只有microsec。