对于学校,我们有一个创建多线程应用程序的任务。我们选择进行合并排序的多线程实现。
然而,我们无法使其比串行实现更快地工作。
我已经尝试了以下内容:
当我在Visual Studio(Instrumentation部分)中使用分析工具时,我发现调用函数的时间,并且线程解决方案总是比串行实现慢得多。
我看不出任何可能的原因。
(例如:有5000000个数字要排序;串行实现:16.717,17;并行:20.259,97;只有1个额外线程的结果)
我在我拥有的两台机器上测试过它:
我不能为我的生活弄清楚这是怎么可能的,这不应该只是加快这个过程吗?
如果有人能够帮助我,我会非常感激。
代码示例1:
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
Thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
thread.Start();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge2.parallel_merge();
thread.Join();
代码示例2:
if(depthRemaining > 0)
{
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
thread.Start();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge2.parallel_merge();
thread.Join();
}
else
{
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
pMerge.parallel_merge();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge.parallel_merge();
}
代码示例3:
if (depthRemaining > 0)
{
Parallel.Invoke(
() => threaded_merge_sort(getallen, p, q, depthRemaining-1));
threaded_merge_sort(getallen, q + 1, r, 0);
}
else
{
threaded_merge_sort(getallen, p, q, 0);
threaded_merge_sort(getallen, q+1, r, 0);
}
答案 0 :(得分:2)
您报告的是什么时间单位?
启动新线程是一种“慢”操作。使用多线程对非常短的列表进行排序/合并可能会慢一些。
如果您只是将数字列表的长度分成两半,程序运行得更快吗?如果不是你的代码根本就没有扩展。
在没有实际代码实现的情况下回答这个问题有点难。
答案 1 :(得分:0)
似乎问题不在于代码,而在于使用VS的分析工具。
-Arne Claerebout