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

Nit*_*jay 2 c# parallel-processing winforms

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

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);
            }
        );
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 16

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

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

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

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

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

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

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

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

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

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

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