我对在 Opensuse Linux 上使用 gcc 4.7.2 的以下代码的结果感到惊讶:
#include <cmath>
#include <chrono>
#include <cstdlib>
#include <vector>
#include <chrono>
#include <iostream>
#include <future>
int main(void)
{
const long N = 10*1000*1000;
std::vector<double> array(N);
for (auto& i : array)
i = rand()/333.;
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
for (auto& i : array)
pow(i,i);
end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
start = std::chrono::system_clock::now();
for (auto& i : array)
std::packaged_task<double(double,double)> myTask(pow);
elapsed_seconds = std::chrono::system_clock::now()-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
start = std::chrono::system_clock::now();
for (auto& i : array)
std::packaged_task<double()> myTask(std::bind(pow,i,i));
elapsed_seconds = std::chrono::system_clock::now()-start;
std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
return 0;
}
结果看起来像这样(并且在运行中相当一致):
elapsed time: 0.694315s
elapsed time: 6.49907s
elapsed time: 8.42619s
如果我正确地解释结果,仅仅创建一个std::packaged_task
(甚至不执行它或存储它的参数)已经比executing
pow
. 这是一个有效的结论吗?
为什么会这样?
这是偶然的gcc特定的吗?