2017-03-24 7 views
0

私はBlockingCollectionのパフォーマンスをベンチマークしています。 main()方法でTask.Run()によって作成されたスレッド数をカウントしてください

class Program 
{ 
    private static BlockingCollection<int> bc = new BlockingCollection<int>(100000); 
    private static BlockingCollection<int> bc2 = new BlockingCollection<int>(100000); 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      bc.TryAdd(i); 

     } 

     var stopWatch = new Stopwatch(); 
     stopWatch.Start(); 

     while (bc.Count != 0) 
     { 
      bc.Take(); 
     } 
     stopWatch.Stop(); 

     Console.WriteLine("Simple " + stopWatch.Elapsed.TotalMilliseconds); 
     createThreadPool(bc2); 



     Console.Read(); 
    } 

    static void ByTaskRun(BlockingCollection<int> blockingCollection) 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      blockingCollection.TryAdd(i); 

     } 
     var stopWatch = new Stopwatch(); 
     stopWatch.Start(); 
     Task k = Task.Run(() => 
     { 
      while (blockingCollection.Count != 0) 
      { 
       blockingCollection.Take(); 
      } 
     }); 

     stopWatch.Stop(); 

     Console.WriteLine("Task.run " + stopWatch.Elapsed.TotalMilliseconds); 
    } 
} 

ByTaskRun()に私は要素を取り出すタスクを実行している間、私は単純に、ブロッキングコレクションから要素を取ります。私はTask.Run()がより速いことを発見しました。内部でThreadpoolを作成していますか? Task.Runによって作成されたスレッドの数を取得したい場合は、その番号を取得するにはどうすればよいですか?

+0

.net ThreadPoolのサイズを見てください。これは、コンソールアプリケーションでデフォルトで作業がスケジュールされる場所です。 BlockingCollectionは、キューイングの場合、貧しい人のBufferBlockです。 TPL DataFlowを見て、ThreadPool(または何もない)での作業を調整する適切な非同期の方法を見てください。 – spender

+0

Process.Threadsをチェックすることもできます。 https://msdn.microsoft.com/en-us/library/system.diagnostics.process.threads(v=vs.110).aspx – Michael

+0

作成するには、私の100000レコードを削除する4つのスレッドブロックコレクション? – Sameer

答えて

0

Task.Run()スレッドのみを使用してください。 あなたは実際の作業時間はありません。

+0

私は* use *(* create *とは対照的)という言葉にさらに重点を置くべきだと思います。 Task.Runは、ThreadPoolを使用するデフォルトのスケジューラーでタスクをキューに入れるだけです。通常の状況下では、スレッドは作成されません。 ThreadPoolがロードされている場合は、スレッドをさらに作成するかもしれません。多分。 – spender

+0

複数のスレッドを作成して要素を消費したい場合はどうすればよいですか?スレッドをさらに作成するにはどうすればよいですか? – Sameer

+0

各ループでTask.Runを呼び出す場合 –

関連する問題