2010-04-09 4 views
0

나는 C# .net에서 프로젝트를 만들고있다. 내 실행 프로세스가 매우 느립니다. 그 이유는 하나의 목록에서 다른 목록으로 값을 복사 한 것입니다.이 목록에는 모든 행에 대해 더 많은 3000 값이 있습니다. 내가 속도를 높일 수있는 방법이 process.any의 몸이 나에게내 실행 속도를 높이는 방법

for (int i = 0; i < rectTristrip.NofStrips; i++) 
      { 
       VertexList verList = new VertexList(); 
       verList = rectTristrip.Strip[i]; 
       GraphicsPath rectPath4 = verList.TristripToGraphicsPath(); 
       for (int j = 0; j < rectPath4.PointCount; j++) 
       { 
        pointList.Add(rectPath4.PathPoints[j]); 
       } 

      } 

도움이 코드 내 procees.Rect의 tristirp을 느린는

+0

오늘 완료 방법을 보여주는 코드를 공유하지 않으면 말하기가 불가능합니다. –

+2

나는 당신 한마디 : profile을 가지고 있습니다. –

+0

@musicfreak 백도어가이 백도어에 대해 말한 이유는 무엇입니까? – ratty

답변

3

프로파일 러는 말할 것입니다 .. 각 정점보다 3000 개 값이 정점을 많이 구성 당신은 얼마나 많은 시간이 어떤 라인에 쓰이고 어떤 것이 가장 최적화되어 있는지 정확하게 알 수 있습니다. 레드 게이트는 아주 좋은 것입니다. musicfreak처럼

http://www.red-gate.com/products/ants_performance_profiler/index.htm

+0

샘에 동의합니다. 또 다른 좋은 프로파일 러 : http://www.jetbrains.com/profiler/. 30 일 무료 평가판이 있습니다 – PierrOz

0

은 이미 무슨 일이 일어나고 있는지에 대한 신뢰할 수있는 결과를 얻을 수 있도록 코드를 프로파일 링해야 언급했다. 그러나 일부 프로세스는 약간의 시간이 걸립니다.

어떤 식 으로든 그들을 없앨 수는 없지만 수행해야합니다. 질문은 단지 필요합니다. 따라서 GUI를 사용자가 액세스 할 수있는 동안 초기화 단계 나 결과를 계산할 다른 스레드에 넣을 수 있습니다.

내 응용 프로그램 중 하나에서 SQL Server에 대해 큰 쿼리를 만듭니다. 이 작업에는 잠깐 (연결 작성, 질의 보내기, 결과 기다리기, 결과를 데이터 테이블에 넣기, 사용자가 계산 결과를 사용자에게 표시하는 작업)이 있습니다. 이 모든 단계가 필요하며 더 빨리 수행 할 수 없습니다. 그러나 사용자가 결과 창에서 진행 표시 줄과 함께 '기다려주십시오'라는 것을 보면서 다른 스레드에서 완료됩니다. 그 동안 사용자는 이미 UI에서 다른 설정을 할 수 있습니다 (좋아하는 경우). 따라서 UI는 반응이 좋으며 사용자는 몇 초 동안 기다릴 큰 문제가 없습니다.

이것은 실제 답변이 아니지만 문제 해결 방법에 대한 아이디어를 제공 할 수 있습니다.

0

로드를 몇 개의 작업자 스레드, 즉 각각 1000 개의 요소를 처리하는 3 개의 스레드로 나눌 수 있습니다. 당신은 내가 대부분의 작업이 TristripToGraphicsPath()에 생각에도 불구하고, AutoResetEvent

+0

그러면 멀티 코어 시스템에서만 속도가 향상됩니다. – chriszero

+0

예, 멀티 코어를 사용하더라도 바쁜 웹 서버 환경에서는별로 도움이되지 않습니다. .NET 4.0의'Parallel.For'는 오버 헤드가 훨씬 적어 훨씬 더 나은 선택이 될 것입니다. – Steven

+0

그러나 .NET 4.0은 아직 베타 버전입니다. –

0

제안과 동기화 할 수 있습니다

// Use rectTristrip.Strip.Length instead of NoOfStrips 
    // to let the JIT eliminate bounds checking 
    // .Count if it is a list instead of array 
    for (int i = 0; i < rectTristrip.Strip.Length; i++) 
    { 
     VertexList verList = rectTristrip.Strip[i]; // Removed 'new' 
     GraphicsPath rectPath4 = verList.TristripToGraphicsPath(); 

     // Assuming pointList is infact a list, do this: 
     pointList.AddRange(rectPath4.PathPoints); 
     // Else do this: 

     // Use PathPoints.Length instead of PointCount 
     // to let the JIT eliminate bounds checking 
     for (int j = 0; j < rectPath4.PathPoints.Length; j++) 
     { 
      pointList.Add(rectPath4.PathPoints[j]); 
     } 
    } 
0

어쩌면 verList = rectTristrip.Strip [I] // 'VertexList'를 제거하여 메모리를 절약하십시오. 변수 VertexList verList를 루프 위에 정의하십시오.

+0

VertexList가 값 유형이 아닌 이상 메모리를 절약하지 못합니다. –

+0

네, 맞습니다. – raf

관련 문제