c#并行编程--Parallel提供对并行循环和区域的支持

c#并行编程--Parallel提供对并行循环和区域的支持

http://msdn.microsoft.com/zh-cn/library/dd537608

 

Parallel提供了对数据并行的支持,主要是迭代处理数据集合,针对For和Foreach数据环境编程,

Parallel提供方式用多线程来处理不同的数据区域

 

下面是我自己测试的一个例子。主要测试For方法

这是一个普通输出信息的方法


       static void Test(int i)
        {
            Console.WriteLine("Test __{0}",i);
        }

 

static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int n = 0; n < 100; n++)
            {
                Test(n);
            }
             sw.Stop();
           

            Stopwatch s2 = new Stopwatch();
            s2.Start();
            Parallel.For(0, 100, Test);
            s2.Stop();
            Console.WriteLine("1______" + sw.ElapsedMilliseconds.ToString());
            Console.WriteLine("2______"+s2.ElapsedMilliseconds.ToString());
           
            Console.WriteLine("------------------------------------------");
            Console.ReadLine();
        }

第一个方法是用普通的for循环,第二个方式是是用Parallel.For方式

分表记录时间27 和 99,反而是普通的for运算比并行方式更快

For() 循环的循环体很小时,它的执行速度可能比等效的顺序循环更慢。 对数据进行分区所涉及的开销以及调用每个循环迭代上的委托的开销导致了性能降低

 

参考这个方法,可以解决在循环比较少的情况下的问题。

http://msdn.microsoft.com/zh-cn/library/dd560853

 

 

但是更新那个Test方法,加入一个线程休眠方法

        static void Test(int i)
        {
            Thread.Sleep(100);
            Console.WriteLine("Test __{0}",i);
        }

然后在运行Main方法,就发现有很大的差别


普通方式的时间是10027,并行的方式3118

关键是输出的信息差别也很大

普通方式就是顺序输出Test,0,1,2,3,4,5,6,7,8.。。100.

并行方式输出的顺序完全是混乱的,没有顺序。这样符合msdn的描述:Parallel提供多线程对数据集合的不同分段区域进行处理。既然是多线程,顺序自然就不同,无法确定哪个先启动

 

中断迭代的方法

Parallel.For 方法 (Int32, Int32, Action<Int32, ParallelLoopState>)

 void TestMethod()
    {
        Parallel.For(0, N, (i, loopState) =>
        {
            Console.WriteLine(i);
            if (i == 100)
            {
                loopState.Break();
            }
        });
    }

 

调用 Break 将通知 For 操作当前迭代后的迭代不需要执行。 但是,当前迭代之前的所有迭代如果尚未执行,则仍需要执行。

因此,调用 Break 与 C# 等语言的传统 for 循环中使用中断操作类似,但这不是理想的替代,因为不能保证当前迭代之后的迭代都不会执行。

如果不必要执行当前迭代之前的所有迭代,则首选 Stop 而不是使用 Break。 调用 Stop 将通知 For 循环它可能放弃所有剩余迭代,无论它们是位于当前迭代的上方还是下方,因为所有必需的工作已经都完成。 但是对于中断,没有关于不执行其他迭代的任何保证。

当循环已提前结束时,返回的 ParallelLoopResult 将包含有关循环完成的相关信息。

http://msdn.microsoft.com/zh-cn/library/dd783584

 

 

 

posted @ 2012-05-27 11:11  音乐啤酒  阅读(1379)  评论(0编辑  收藏  举报