2017-03-24 3 views
0

BlockingCollection의 성능을 벤치마킹하고 있습니다. ByTaskRun()에 내가 요소를 꺼내 작업을 실행하는 동안 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); 
    } 
} 

, 나는 단순히 차단 컬렉션에서 요소를 가지고. 나는 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

4 개의 스레드로 내 100,000 개의 레코드를 제거한다고 가정 해 봅시다. 컬렉션을 차단 하시겠습니까? – Sameer

답변

0

이 샘플에서 Task.Run() 스레드 만 사용하십시오. 그리고 실제 근무 시간이 없습니다.

+0

나는 * use * (* create *와 반대)라는 단어를 강조해야한다고 생각합니다. Task.Run은 ThreadPool을 사용하는 기본 스케줄러에 작업을 대기시킵니다. 정상적인 상황에서는 스레드가 생성되지 않습니다. ThreadPool이로드되고있는 경우는, thread를 추가로 작성할 수 있습니다. 아마도. – spender

+0

둘 이상의 스레드를 작성하여 요소를 소비하려면 어떻게해야합니까? 스레드를 더 많이 생성하려면 어떻게해야합니까? – Sameer

+0

각 루프에서 Task.Run을 호출하면 –