3

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

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

1 回答 1

17

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

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

九个女人一个月都不能聚在一起生孩子。当您并行化某些操作时,它们不会加速。这是其中之一。

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

将它们并行化后变得更快的操作具有以下特性:(1)问题可以轻松地分成任意数量的部分,(2)较小的问题可以相互独立地正确解决,以及(3)解决方案较小的问题可以很便宜地组合成较大问题的解决方案。

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

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

不,首先,如果您希望在并行化作业时更快,您需要使处理器饱和。如果您只有四个处理器,那么十个线程会使您的程序变慢,而不是更快。其次,创建和管理线程是有成本的,而这些成本超出了底线。

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

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

总结:不要尝试并行化,除非你有一个容易并行化的问题使处理器饱和,其中工作比创建线程要昂贵得多,并确保线程数不超过处理器数。理想情况下,您想使用任务而不是线程;任务并行库旨在为您完成计算要调度多少线程的工作。

于 2013-01-31T05:53:44.917 回答