我在使用gcc 4.7.2在openSUSE Linux的下面的代碼的結果感到驚訝:是std :: packaged_task真的很貴嗎?
#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
更加昂貴。這是一個有效的結論嗎?
這是爲什麼?
這是偶然的海灣合作委員會的具體?
嘛,自然,包裝任務包含同步原語,是昂貴的 - 總線鎖定和管道沖洗都是低層次的同步原語的共同後果,所以單線程同步總是會失去針對單線程的非同步。您必須真正能夠從並行或並行執行中受益,才能使並行解決方案成爲可行的改進。 –
(你可以建立你自己的打包任務[帶有承諾](http://stackoverflow.com/q/11004273/596781)。單單承諾包含一些嚴重的同步機制。) –
@KerrekSB,如果創建一個packaged_task需要使用多個鎖定基元。畢竟,沒有可能的爭論(尚)。創建這麼多的互斥鎖只需要0.09s - 所以除非你需要爲每個packaged_task創建10個互斥鎖,還是有很大的空間... –