为何使用std::execution::par的sort比普通sort耗时更长?
为什么并行排序比串行排序耗时更长?
我用std::execution::par做并行排序,原本以为会比串行排序更快,但实际测试中,相同的向量v1(串行排序)耗时反而比v2(并行排序)更短,这是为什么?
测试代码
#include <iostream> #include <vector> #include <chrono> #include <algorithm> #include <execution> using namespace std; int main() { // Generate identical vectors v1 and v2 of length N // and fill them with v[i] = i/200; int N = 10000; vector<int> v1(N); for(int i=0; i<N; i++) v1[i] = i/200; auto v2 = v1; // Calculate the time taken to sort in serial way. auto start = std::chrono::system_clock::now(); sort(v1.begin(), v1.end()); auto end = std::chrono::system_clock::now(); auto diff = end - start; cout << diff.count() << " = serial count" << endl; // Calculate the time taken to sort in parallel way using // std::execution::par start = std::chrono::system_clock::now(); sort(std::execution::par, v2.begin(), v2.end()); end = std::chrono::system_clock::now(); diff = end - start; cout << diff.count() << " = parallel parallel" << endl; return 0; }
测试结果
626600 = serial count 1048100 = parallel count
原因分析
- 数据量不足:你的向量仅包含10000个元素,并行排序需要额外付出线程创建、任务调度、数据拆分与合并的开销,这些开销的总和远超过多线程并行计算带来的效率提升。只有当数据量达到百万级甚至千万级时,并行排序的优势才会显现。
- 数据特性影响:向量中的元素是
i/200,存在大量重复值。串行排序的实现可能针对这类高度重复的数据做了特殊优化(比如快速排序的分支裁剪、或是隐含的计数排序逻辑),而并行排序的实现可能未针对该场景优化,导致子任务处理效率不如串行。 - 计时误差:单次计时的偶然性误差较大,建议多次运行测试取平均值,或者改用
std::chrono::high_resolution_clock提升计时精度,减少偶然因素对结果的干扰。 - 线程调度开销:并行排序需要操作系统调度多个线程执行,线程切换、资源分配本身就有固定开销,当数据量较小时,这些固定开销会成为耗时的主要部分,完全抵消了并行计算的优势。
内容的提问来源于stack exchange,提问作者dark_nite77
相关产品推荐
相关产品推荐

