2010-08-03 3 views
0

루프의 항목 수가 1,000 개를 넘고 10 분 정도가되면이 루프가 계속 실행됩니다. 이것은 30 ~ 40,000에 이르는 모든 금액에 대해 신속하게 실행해야합니다.루프가 오래 걸립니다. 많은 수의 루프가 걸립니다.

'Add all Loan Record Lines 
Dim loans As List(Of String) = lar.CreateLoanLines() 
Dim last As Integer = loans.Count - 1 
For i = 0 To last 
    If i = last Then 
     s.Append(loans(i)) 
    Else 
     s.AppendLine(loans(i)) 
    End If 
Next 

은 StringBuilder입니다. 첫 번째 줄이

Dim loans As List(Of String) = lar.CreateLoanLines() 

수천 개의 레코드가있는 경우에도 몇 초 만에 실행됩니다. 그것은 시간이 좀 걸리는 실제 루프입니다.

어떻게 최적화 할 수 있습니까 ???

+0

가있을있다 loans.Select() 메서드를 사용하여 원하는 결과를 얻을 수있는 방법. 누구든지 그 일을 어떻게 알아? 나는 그것에보고 있지만 순간에 주위에 구글 검색 – Gage

+0

릴리스 모드, 또는 디버그 모드 타이밍이 있습니까? 디버거/호스팅 프로세스에서 이것을 실행하면 테스트 호스트가 사용자의 타이밍에 영향을 줄 수 있습니다 ... –

+0

문자열의 크기는 얼마나됩니까? –

답변

2

StringBuilder의 초기 용량을 큰 값으로 설정하십시오. 용량을 지정하지 않는 경우, 빌더 가능성이 내부 재 할당 많은 양의 일을 끝낼 것

s = new StringBuilder(loans.Count * averageExpectedStringSize) 

, 이것은 죽일 것이다 그래서 같이 (. 이상적으로, 충분히 큰 전체 최종 문자열을 포함하는) 공연.

+0

성능을 향상시키지 않습니다. 이 사람이 나를 너무 오랫동안 죽였어! – Scott

+0

나는 다른 것을 제안 할 것이 없다고 생각합니다.제공 한 코드 스 니펫을 기반으로 선형 시간으로 실행되어야하는 것처럼 보입니다. –

1

루프에서 특수 케이스를 가져올 수 있으므로 루프 내부에서 특수 케이스를 검사 할 필요가 없습니다. 그러나 성능에 거의 영향을 미치지 않을 것으로 예상됩니다.

For i = 0 To last - 1 
    s.AppendLine(loans(i)) 
Next 
s.Append(loans(last)) 
0

제 생각에 추가를 사용할 때마다 새 문자열이 생성됩니다. 모든 메모리를 먼저 할당 한 다음 메모리에 복사하면 얼마나 빨리 실행해야하는지, 얼마나 많은 메모리가 필요한지 알 것입니다. 비록 내가 vb.net이 어떻게 작동하는지에 대해 혼란 스러울 지 모르지만.

1

난 당신이 지적 코드가 느릴 수 있는지 볼 수 없습니다하지 않는 :

  • 당신이 다루고있는 문자열은 huggggge이다 (예를 들어, 결과 문자열이 1기가바이트 경우).
  • 모든 시계 사이클을 소비하는 컴퓨터에서 다른 프로세스가 실행 중입니다.
  • 컴퓨터에 메모리가 충분하지 않습니다.

줄마다 코드를 단계별로 실행하고 문자열에 예상되는 데이터가 포함되어 있는지 확인하고 작업 관리자에서 응용 프로그램의 메모리 사용량과 사용 가능한 메모리 양을 확인하십시오.

0

다른 방법으로 살펴볼 수 있습니다.

Dim str As String = String.Join(Environment.NewLine, loans.ToArray) 
1

비록, 내부 코드는 .NET 4를 사용하는 경우, 나는 String.Join에 단일 통화와 방법을 대체하는 생각 하는데요, 매우 유사합니다

Dim result as String = String.Join(Envionment.NewLine, lar.CreateLoanLines()) 
+0

지금 시도해보십시오. – Scott

관련 문제