私はParallel.ForEach
について少し混乱しています。Parallel.ForEach
とは何ですか?また正確には何をしますか?
MSDNのリンクを参照しないでください。
これは簡単な例です:
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
foreach (string line in list_lines)
{
//My Stuff
}
この例をParallel.ForEach
で書き換えるにはどうすればよいですか?
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
//Your stuff
});
Foreachループ:
- 繰り返しは順番に行われます
- foreachループは単一のスレッドから実行されます。
- foreachループは.NETのすべてのフレームワークで定義されています
- 遅いプロセスは、順次実行されるので、遅く実行することができます。
- プロセス2は1が完了するまで開始できません。プロセス3は、2と1が完了するまで開始できません...
- スレッド化のオーバーヘッドがないため、クイックプロセスの実行は高速になります。
Parallel.ForEach:
- 実行は並行して行われます。
- Parallel.ForEachは複数のスレッドを使用します。
- Parallel.ForEachは.Net 4.0以上のフレームワークで定義されています。
- 遅いプロセスの実行は、より速く実行できます。平行
- プロセス1、2、&3は同時に実行できます(下記の例の再利用スレッドを参照)
- 追加のスレッドオーバーヘッドのため、クイックプロセスの実行は遅くなる可能性があります。
次の例は、従来のforeachループと従来のforeachループの違いを明確に示しています。
Parallel.ForEach()の例
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
class Program
{
static void Main()
{
string[] colors = {
"1. Red",
"2. Green",
"3. Blue",
"4. Yellow",
"5. White",
"6. Black",
"7. Violet",
"8. Brown",
"9. Orange",
"10. Pink"
};
Console.WriteLine("Traditional foreach loop\n");
//start the stopwatch for "for" loop
var sw = Stopwatch.StartNew();
foreach (string color in colors)
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
Console.WriteLine("Using Parallel.ForEach");
//start the stopwatch for "Parallel.ForEach"
sw = Stopwatch.StartNew();
Parallel.ForEach(colors, color =>
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
);
Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
Console.Read();
}
}
}
出力
Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds
Parallel.ForEachの例を使用
1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
// No need for the list
// List<string> list_lines = new List<string>(lines);
Parallel.ForEach(lines, line =>
{
//My Stuff
});
これにより、ループ内で行が並列に解析されます。 Parallelクラスについてもっと詳細で、「参照指向」ではない紹介をしたいのであれば、 Parallel.ForEachのセクション を含むTPLに関するシリーズを書きました。
大きなファイルの場合は、次のコードを使用します(あなたはメモリをあまり必要としません)。
Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
//Your stuff
});
これらの行は私のために働いた。
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
//My Stuff
});