Linqでマルチスレッド。年末には8CPUコアが出るらしい、ここ。2CPUでは1CPUとの差を感じることはないが、4CPUでは少し体感できた。8CPUならもっと体感できるかもしれない。スレッド処理は前からフレームワークようなものが欲しかったが、Parallel Linqはその答えになる。

Microsoft Parallel Extensions to .NET Framework 3.5, June 2008 Community Technology Preview ここ


private void button1_Click(object sender, EventArgs e)
{
int [] ar = new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };

// シーケンシャル
for( int i = 0; i < ar.Length; i++ )
{
Console.WriteLine( string.Format( "{0},{1},{2}", i, ar[i], System.Threading.Thread.CurrentThread.ManagedThreadId ));

Thread.Sleep(1000);

Console.WriteLine( string.Format("−−−−−− {0}", System.Threading.Thread.CurrentThread.ManagedThreadId ));
};

// マルチスレッド Parallel Linq
Parallel.For( 0, ar.Length, delegate(int i )
{
Console.WriteLine( string.Format( "{0},{1},{2}", i, ar[i], System.Threading.Thread.CurrentThread.ManagedThreadId ));

Thread.Sleep(1000);

Console.WriteLine( string.Format("−−−−−− {0}", System.Threading.Thread.CurrentThread.ManagedThreadId ));

});


}
}
}



シーケンシャルの結果は以下です。20秒で終了します。

0,1,8
−−−−−− 8
1,2,8
−−−−−− 8
2,3,8
−−−−−− 8
3,4,8
−−−−−− 8
4,5,8
−−−−−− 8
5,6,8
−−−−−− 8
6,7,8
−−−−−− 8
7,8,8
−−−−−− 8
8,9,8
−−−−−− 8
9,10,8
−−−−−− 8
10,11,8
−−−−−− 8
11,12,8
−−−−−− 8
12,13,8
−−−−−− 8
13,14,8
−−−−−− 8
14,15,8
−−−−−− 8
15,16,8
−−−−−− 8
16,17,8
−−−−−− 8
17,18,8
−−−−−− 8
18,19,8
−−−−−− 8
19,20,8
−−−−−− 8

Parallel Linqの結果は以下です。PCは2cpuです。

0,1,9
1,2,12
2,3,13
3,4,11
−−−−−− 9
4,5,9
−−−−−− 12
6,7,12
−−−−−− 13
8,9,13
−−−−−− 11
10,11,11
−−−−−− 9
5,6,9
−−−−−− 12
7,8,12
−−−−−− 13
9,10,13
−−−−−− 11
11,12,11
−−−−−− 9
12,13,9
−−−−−− 12
16,17,12
−−−−−− 13
−−−−−− 11
−−−−−− 9
13,14,9
−−−−−− 12
17,18,12
−−−−−− 9
14,15,9
−−−−−− 12
18,19,12
−−−−−− 9
15,16,9
−−−−−− 12
19,20,12
−−−−−− 9
−−−−−− 12