我的并行循环没有提高性能

4

我正在使用并行循环以提高加载图表的性能,我已经在并行循环中调用了它。

加载图表的方法有大量代码,我想要并行执行,但当我执行时,并行执行与顺序执行没有显示出差异。

并行和顺序处理都需要相同的执行时间。

我的并行循环代码如下。

List<Chart> lstCharts = new List<Chart>();
        Parallel.For(0, givenSampleArray.Length, i =>
            {
                Chart NewChart = new Chart();

                objChart.LoadChart(ref NewChart, givenSampleArray[i], YAxisTable, XPointsValues,
                                   ScaleMinValue, ScaleMaxValue, ref dtNewRowsContainer,
                                   dtExcelData); 
                NewChart.Tag = (i + 1).ToString();
                NewChart.Width = (pnlChart.Width * 49) / (100);


                Legend legend = AddLegend();
                NewChart.Legends.Add(legend);

                lstCharts.Add(NewChart);
            }
        );

10
将整个操作从一个线程移动到另一个线程并不会改善性能。关键是将操作分布在多个线程中,而不是完全转移到另一个线程中。 - Simon Whitehead
@SimonWhitehead 感谢您的评论。您能否给我一个简要的想法,我需要在代码中做出什么改变,或者提供任何有用的链接。 - Nitin Vijay
2
那段代码如果在多个线程上运行,由于访问共享的不线程安全资源,所以是线程安全的。 - user166390
只是确认一下:dtExcelData 是与 Excel 相关的,还是只是为了好玩而命名的? - Alexei Levenkov
你的ChartControl怎么样?你确定你的图表控件可以同时呈现多个图表吗? - D J
显示剩余2条评论
1个回答

18

注意到您的问题中没有问题,所以我会为您提出一些:

为什么我的程序在并行化后没有变快?

九个女人不能在一个月内生一个孩子。有些操作并行化时不会加速。这就是其中之一。

哪些问题特征能够通过并行化有效地解决?

当你并行化它们时,能够加速的操作具有以下属性:(1) 问题可以轻松地分成任意多个部分,(2) 小问题可以独立地正确求解,(3) 小问题的解决方案可以廉价地组合成一个解决大问题的方案。

例如,将物理模拟与计算分形图像进行比较。许多相互作用的物体的模拟很难分解成子问题,因为所有部分都相互作用。但第一千个像素与第二千个像素不相互作用。分形计算很容易并行化;物理模拟则更难并行化。(当然也可以做到;只是不容易。)

假设我要解决一个“尴尬并行”的问题。那么开启十个线程可以使它运行十倍快吗?

不可以。首先,如果你想让并行化后的作业更快,你需要使处理器达到饱和状态。如果你只有四个处理器,那么十个线程会让你的程序变慢,而不是变快。其次,创建和管理线程是有成本的,这些成本将反映在底线上。

把线程看作是司机,而处理器则是汽车。如果你有一千个包裹要送,只有一辆车和一个司机,或许需要100个小时才能完成。如果你雇佣了另一个司机,花费了钱但没有额外的汽车,速度不会更快,反而会更慢。如果你购买了四辆汽车,你想要四个司机每人送250个包裹。那需要25个小时吗?好吧,你雇用这些司机要花多长时间?线程是很昂贵的资源,需要时间来分配,你必须考虑到这一点。

当然,你肯定不希望4辆车被10个司机共享,每个司机负责100个包裹!这只会使速度更慢、费用更高,因为你正在支付所有10个司机,即使此刻至少有6个司机正在等待一辆可用的汽车而闲置。

总结一下:除非你有一个易于并行化的问题可以饱和处理器,其中任务比创建线程更加昂贵,并确保线程数不超过处理器数量,否则不要试图并行化。理想情况下,你应该使用任务而不是线程;任务并行库是为你设计的,它会为你确定应该调度多少个线程。


+1 至非常好的回答... 添加一个可能涵盖原问题的情况:「世界上只有一辆汽车能够交付那种类型的包裹——所以无论你有多少司机,仍然只有一辆车可用。」Excel 就是这样的车 - 最有可能不能并行访问 Excel... - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接