c+;中的异步出现意外结果+; 我在C++中接近并行编程,并且当我使用返回值的函数时,我决定使用 STD::AycY 将来< /Cord>对象。特别是,我正在并行化一个积分器。我有一个函数integrate(const std::vector&v,double h),它计算存储在v中的函数下的积分

c+;中的异步出现意外结果+; 我在C++中接近并行编程,并且当我使用返回值的函数时,我决定使用 STD::AycY 将来< /Cord>对象。特别是,我正在并行化一个积分器。我有一个函数integrate(const std::vector&v,double h),它计算存储在v中的函数下的积分,c++,performance,c++11,asynchronous,C++,Performance,C++11,Asynchronous,我首先用一个长向量尝试函数并记录时间,然后我将向量分成三个子向量,同时对三个不同的子向量进行积分。但是,第二次总是比第一次长,这是不可能的。我做错了什么 double a; const clock_t begin_time1 = clock(); a=integral(v1, h); cout << double( clock () - begin_time1 ) / CLOCKS_PER_SEC << endl; future<double> f1,

我首先用一个长向量尝试函数并记录时间,然后我将向量分成三个子向量,同时对三个不同的子向量进行积分。但是,第二次总是比第一次长,这是不可能的。我做错了什么

double a;

const clock_t begin_time1 = clock();
a=integral(v1, h);
cout << double( clock () - begin_time1 ) /  CLOCKS_PER_SEC << endl;

future<double> f1, f2,f3;
const clock_t begin_time2 = clock();
f1 = async(launch::async, integral, ref(sv1), h);
f2 = async(launch::async, integral, ref(sv2), h);
f3 = async(launch::async, integral, ref(sv3), h);
cout << double( clock () - begin_time2 ) /  CLOCKS_PER_SEC << endl;

cout << a << "  " << f1.get()+f2.get()+f3.get() << endl;
双a;
常数clock\u t begin\u time1=时钟();
a=积分(v1,h);

cout启动3个线程所需的时间比运行计算所需的时间要长。

为什么您认为“这是不可能的”?请提供一个包含编译标志的示例,我的意思是,在异步完成任务之前,上面的代码乘以异步!另外,在没有编译器优化标志的情况下,强制执行一个性能问题:几乎每个C++的性能问题都有人要求,在被问之前没有提供它,显示了不足的研究。你必须将整个向量复制到子向量中吗?为什么不在同一个向量的不同部分使用三组
begin/end
迭代器呢?在所有get()s之后测量时间将更具决定性。melpomene:积分时间(以及几乎所有以向量为参数的函数)与向量长度成正比。如果向量短三倍,怎么可能需要更多的时间呢?是的,但我尝试使用不同的长向量(10^7-8个元素)运行测试,这些向量在不可忽略的时间后存储在哪里。考虑到我是通过引用强制传递的,启动三个线程比完全执行一个三倍长的线程还要长,这更是胡说八道。