26

可能重复:
C++ Timer 函数以纳秒为单位提供时间

我需要以纳秒分辨率测量函数执行的持续时间。可能吗?我们普通的计算机硬件和软件能够给出这样的时间精度吗?如果是,如何用 C++ 来实现?Boost库可以吗?

4

4 回答 4

54

是的,今天大多数硬件都支持这种分辨率,C++ 标准库也有一个 API 可以支持它。不幸的是,并非所有 C++ 实现都确实提供了它。

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

#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++ 中的<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
}
于 2012-10-17T15:44:25.887 回答
2

我不确定您是否正在寻找时钟或 difftime,但其中之一应该是您正在寻找的:

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

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

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

于 2012-10-17T15:41:03.703 回答
2

使用 Windows API 可以做的最好的事情是QueryPerformanceCounter您可以使用QueryPerformanceFrequency获得其分辨率。视情况而定,这可能是使用 CPU 的 RDTSC 指令,在这种情况下,频率基本上是 CPU 的时钟频率。在其他情况下,它使用频率为 1.024 MHz 的单独时钟,因此分辨率基本为 1 微秒。

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

于 2012-10-17T15:42:03.040 回答
1

当然还有旧的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();

不过,只有微秒。

于 2012-10-17T15:50:21.047 回答