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