我正在使用并行循环来提高加载我的图表的性能,我在并行循环中调用了它。
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);
}
);
答案 0 :(得分:16)
我注意到你的问题没有问题,所以我会问你一些问题:
为什么我的程序在并行化时不会变得更快?
九个女人在一个月内无法聚在一起生孩子。并行化时,某些操作不会加速。这是其中之一。
通过并行化可以有效解决问题的特征是什么?
并行化时运行速度更快的操作具有以下特性:(1)问题可以轻松分成任意多个部分,(2)较小的问题可以相互独立地正确解决,(3) )小问题的解决方案可以廉价地组合成更大问题的解决方案。
例如,比较计算物理模拟和计算分形图像。许多相互作用体的模拟很难分解为子问题,因为所有部分都相互作用。但分形的前千个像素不与第二千个像素相互作用。分形计算很容易并行化;物理模拟很难并行化。 (虽然当然可以做到;但这并不容易。)
假设我确实有一个“令人尴尬的并行”问题需要解决。制作十个线程会使它快十倍吗?
没有。首先,如果您希望在并行化时更快地完成作业,则需要使处理器饱和。如果您只有四个处理器,则十个线程使您的程序更慢,而不是更快。其次,创建和管理线程有成本,而这些成本来自底线。
将线程视为汽车的驱动程序和处理器。如果你要提供一千个包裹,一辆车和一个司机,可能需要100个小时。如果你雇用另一个司机,你已经把钱花在司机身上,但没有额外的车,它就不会更快;它会变慢。如果您购买四辆汽车,您需要四名司机每人提供250个包裹。需要25个小时吗?嗯,雇用这些司机需要多长时间?线程分配不便宜;这需要时间,你必须考虑到这一点。
你当然不希望四个车共享十个司机,每个司机负责100个包裹!这只会让它变得更慢,更昂贵,因为你支付所有十个司机的费用,即使在任何时候他们至少有六个人闲置等待汽车可用。
总结:不要尝试并行化,除非你有一个容易并行化的问题使处理器饱和,其中作业比创建一个线程要昂贵得多,并确保没有比处理器更多的线程。理想情况下,您希望使用任务而不是线程;任务并行库旨在帮助您确定要安排的线程数。