You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:41:30