我的并行循环不会提高性能

时间:2013-01-31 05:33:18

标签: c# winforms parallel-processing

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

Load Chart方法有很大的代码,我希望并行执行,但是当我执行时它没有显示并行执行和顺序执行的差异。

并行和顺序过程都需要相同的时间来执行。

我的并行循环代码如下。

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);
            }
        );

1 个答案:

答案 0 :(得分:16)

我注意到你的问题没有问题,所以我会问你一些问题:

  

为什么我的程序在并行化时不会变得更快?

九个女人在一个月内无法聚在一起生孩子。并行化时,某些操作不会加速。这是其中之一。

  

通过并行化可以有效解决问题的特征是什么?

并行化时运行速度更快的操作具有以下特性:(1)问题可以轻松分成任意多个部分,(2)较小的问题可以相互独立地正确解决,(3) )小问题的解决方案可以廉价地组合成更大问题的解决方案。

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

  

假设我确实有一个“令人尴尬的并行”问题需要解决。制作十个线程会使它快十倍吗?

没有。首先,如果您希望在并行化时更快地完成作业,则需要使处理器饱和。如果您只有四个处理器,则十个线程使您的程序更慢,而不是更快。其次,创建和管理线程有成本,而这些成本来自底线。

将线程视为汽车的驱动程序和处理器。如果你要提供一千个包裹,一辆车和一个司机,可能需要100个小时。如果你雇用另一个司机,你已经把钱花在司机身上,但没有额外的车,它就不会更快;它会变慢。如果您购买四辆汽车,您需要四名司机每人提供250个包裹。需要25个小时吗?嗯,雇用这些司机需要多长时间?线程分配不便宜;这需要时间,你必须考虑到这一点。

你当然不希望四个车共享十个司机,每个司机负责100个包裹!这只会让它变得更慢,更昂贵,因为你支付所有十个司机的费用,即使在任何时候他们至少有六个人闲置等待汽车可用。

总结:不要尝试并行化,除非你有一个容易并行化的问题使处理器饱和,其中作业比创建一个线程要昂贵得多,并确保没有比处理器更多的线程。理想情况下,您希望使用任务而不是线程;任务并行库旨在帮助您确定要安排的线程数。