多线程合并排序比常规合并排序慢两倍

问题描述 投票:0回答:0

所以我一直在研究多线程,并一直在尝试对字符串向量(字典顺序)实现(多线程)合并排序。我猜他们两个都表现不错(<200 cpu cycles) but whereas the regular merge sort is only 80 cycles, multithreaded seems to be more like 160 cycles.

这里是精简代码以供参考:

多线程平分部分:

void MultiMergeSort(vector<string>& target){
      if (target.size()<2) return;
      else{
         vector<string> left = vector<string>(target.begin(), target.begin()+target.size()/2);
         vector<string> right = vector<string>(target.begin() + target.size()/2, target.end());
         thread worker1 = thread(MultiMerge, left);
         thread worker2 = thread(MultiMerge, right);
         worker1.join();worker2.join();
         target = Merge(left, right);
   }
   return;

}

正则二分法:

vector<string> MergeSort(const vector<string>& target){
       vector<string> res = target;
       if(target.size()<2)return res;
       else{
         vector<string> left = vector<string>(target.begin(), target.begin()+target.size()/2);
         vector<string> right = vector<string>(target.begin() + target.size()/2, target.end());
         left = MergeSort(left); right = MergeSort(right);
         res = Merge(left, right);
       }
       return res;
} 

最后合并功能:

vector<string> Merge(const vector<string>& left, const vector<string>& right){
     vector<string> res;
     while(i < left.size() && j < right.size()){
         if(left[i] <= right[j]) res.push_back[i++];
         else res.push_back[j++];
   }
     while(i<left.size()) res.push_back[i++];
     while(j<right.size()) res.push_back[j++];
     return res;
}

我知道这里有一些非常简单的优化要做,我会做的,但除此之外它们完全相同,但一个是多线程的,你会认为这会使它更快但不是。

因为在对函数进行线程处理时无法捕获函数的返回值,所以我不得不将合并的东西变成一个就地引用的东西,但它不应该对 afaict 产生影响(如果任何通过引用传递的东西应该是一个提升速度)。

我有一个简单的设置来测量使用

clock
所花费的时间,我得到

82 个时钟用于单线程合并排序和 141 个时钟用于多线程。

c++ multithreading algorithm sorting mergesort
© www.soinside.com 2019 - 2024. All rights reserved.