所以我一直在研究多线程,并一直在尝试对字符串向量(字典顺序)实现(多线程)合并排序。我猜他们两个都表现不错(<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 个时钟用于多线程。