2014-04-17 5 views
0

몇 가지 일반적인 속성이있는 사용자 지정 클래스 목록을 반복하고 싶습니다. 좀 카운터를 입력해야하기 때문에 목록은 내가 아주 빠른 방법 및 특성을 확인에서 반복하는 방법에 대한 최선의 방법을 읽고있다속성을 기반으로 카운터를 반복하고 설정하는 빠른 방법

을 거대하고 성장하는 것은 (3000items로 시작하고 + 10,000에 도달 할 수 있습니다)됩니다.

In .NET, which loop runs faster, 'for' or 'foreach'?

http://www.codearsenal.net/2013/12/csharp-multithreading-loop-parallel-for.html#.U09-qPl_vA0

하지만 이러한 속성을 검사하는 로직을 수행해야하는 경우 ... 빨리 무엇을 할 것인가? 순간

내 코드는 다음과 같습니다

public void CalculateTotalCounters() 
    { 
    #region ParallelCounting 

    countTotal = 0; 
    countMapped = 0; 
    countNotMapped = 0; 
    countError = 0; 

    errorFound = false; 

    MyList.AsParallel().ForAll(acc => 
    { 
     lock (this) 
      ++countTotal; 

     if (!string.IsNullOrEmpty(acc.isMapped)) 
     { 
      lock (this) 
       ++countMapped; 
     } 

     if (string.IsNullOrEmpty(acc.isMapped)) 
     { 
      lock (this) 
       ++countNotMapped; 
     } 

     if (acc.HasError || acc.NotUnique || acc.DefalutName || acc.DefaultValue) 
     { 
      lock (this) 
      { 
       ++countError; 
       errorFound = true; 
      } 
     } 
    }); 

    #endregion 
    } 

내가 isMapped위한 조건 두 가지가 하나 될 수있는 알고있는 경우 - 다른 사람 (이 잠금에 영향을 줄 수?)

감사합니다 .

+0

는 당신에게 카운터의 잠금이 필요 확실 해요? – Codor

+0

사용하지 않을 때 이상한 결과가 나타납니다. 잠금에 대한 내 문제와 가까운 대답을 찾지 못했습니다. – blfuentes

+0

'잠그지 마십시오'. 인스턴스에서 잠글 수있는 항목이 무엇인지 알 수 없습니다. – Rawling

답변

2

잠금은 병렬로 얻은 성능을 저하시킵니다.

당신은 http://msdn.microsoft.com/en-us/library/dd78zt0c(v=vs.110).aspx

Interlocked.Increment(countMapped) 

은 또한 너무 많은 일을 계산 할 필요가 없습니다 연동 증가 사용할 수 있습니다. 루프가 끝나면 다음을 계산할 수 있습니다.

하지만 무엇이든지간에 프로파일 링해야합니다 (예 : 시간 지정). 이를 위해 Stopwatch 클래스를 사용할 수 있습니다. 그런 다음 다른 것을 시도해 볼 수 있습니다.

그런 다음 다음을 시도해야합니다 :

countMapped = MyList.Count(acc => istring.IsNullOrEmpty(acc.isMapped); 

countMapped = MyList.AsParallel().Count(acc => istring.IsNullOrEmpty(acc.isMapped); 
+0

감사. 필자는 병렬 ForAll (~ 860ms), "정상"카운트 ~ 430ms 및 "병렬"카운트 ~ 800ms의 세 가지 방법을 테스트했습니다. 그런 다음 루프가 끝나면 두 개의 카운트를 사용하고 다른 속성을 계산하는 것이 가장 좋습니다. – blfuentes

관련 문제