对相对较大的循环使用并行化

时间:2010-10-16 08:54:45

标签: c# performance task task-parallel-library

我有一台8核CPU机器,内存为8 GB。逻辑上,以下代码可以并行完成,但由于循环暴露了足够的并行机会,因为我可用的核心数远少于循环的大小。其次,每个委托表达式都会分配一些内存来保存自由变量。 在这种情况下,是否建议使用parallel?

也会将2个并行分为2个任务,在这种情况下提高性能??

     private static void DoWork()
    {

        int end1 = 100; // minimum of 100 values; 
        int end2 = 100; // minimum of 100 values;


        Task a = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end1, delegate(int i)
                {
                    // independent work                     
                });
            }
        );

        Task b = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end2, delegate(int i)
                {
                    // independent work                        
                });
            }
        );

        a.Wait();
        b.Wait();         
    }

2 个答案:

答案 0 :(得分:1)

  • 通过调用“Partitioner.Create”将负载平衡保留在框架中。
  • 尝试创建ParallelOptions对象并将其传递给Parallel.For。尝试使用不同的MaxDegreeOfParallelism并根据结果调整代码,这个数字可以超过no。您系统中的核心数。这对我有用。

答案 1 :(得分:1)

  

也会将2个parralel分为2个任务,在这种情况下提高性能?

不明显,您可能很容易损害性能。

TPL专门用于提供负载平衡,让它发挥作用。

您关心的要点是:

  • '工作'应该是独立的
  • '工作'应该是非平凡的,即计算密集型,而不仅仅是添加一些数字
  • '工作'应该避免I / O(尽可能多)