在 C++ 中使用 std::clock 对并行程序计时是非常具有欺骗性的。在对程序进行计时时,我们关心两种类型的时间:wall time 和 cpu time。墙上时间是我们都习惯的(想想墙上的时钟)。 CPU 时间本质上是您的程序使用了多少个 CPU 周期。 std::clock 返回 cpu 时间(这就是为什么要除以 CLOCKS_PER_SEC 的原因),并且当有一个执行线程时,cpu 时间仅等于 wall time。如果一个程序可以 100% 并行运行(就像你的程序一样),那么 cpu 时间 = (线程数)*(wall time)。因此,看到的时间几乎是您所期望的两倍。
为了测量挂机时间(这就是你想要做的),我不知道如何使用 STL 来做到这一点。您可以使用 OpenMP 或 Boost 来测量它。
omp_get_wtime() https://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html
升压定时器 http://www.boost.org/doc/libs/1_60_0/libs/timer/doc/cpu_timers.html
由于您使用的是 Linux,因此您使用的 g++ 版本很可能内置了 openmp 支持。
#include <omp.h>
const double startTime = omp_get_wtime();
..... //Work goes here
const double time = omp_get_wtime() - startTime;
您必须使用 -fopenmp 进行编译
EDIT:
正如 johnbakers 指出的那样,chrono 库确实有一个挂钟 http://en.cppreference.com/w/cpp/chrono/system_clock
#include <chrono>
auto start = std::chrono::system_clock::now();
.... //Do some work
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time: " << diff.count() << "(s)" << std::end;
该输出与升压定时器的输出:
Boost: 121.685972s wall, 724.940000s user + 67.660000s system = 792.600000s CPU (651.3%)
Chrono: 121.683(s)