2012-09-16 2 views
1

필자는 상당히 복잡한 F # 응용 프로그램을 가지고 있으며 #time 지시문을 사용하여 성능을 검사하기 위해 F # 스크립트를 사용합니다. 아이디어는 성능을 추적하고 속도 나 메모리 문제를 피하기 위해 코드를 변경 한 후 스크립트를 실행한다는 것입니다. 내가 얻고 있었다F # 가비지 수집 보고서 해석

보고서는 다음과 같이이었다 :

Real: 00:00:02.908, CPU: 00:00:02.948, GC gen0: 237, gen1: 3, gen2: 1 

을하지만 마지막 변경 후 나는이 얻을 :

Real: 00:00:03.058, CPU: 00:00:03.057, GC gen0: 262, gen1: 262, gen2: 0 

을 나는 몇 가지 문제에 무슨 일이 일어나고 있는지 알아내는 있습니다.

더 많은 생성 1 가비지 수집은 생성 0에서 가비지 수집에서 생존하는 더 오래 살아있는 객체가 있음을 의미하지만 (?), 갑자기 3에서 262로 갑자기 이동합니까? 그리고 0 세대와 1 세대의 가비지 콜렉션 수가 동일한 이유는 무엇입니까? 코드 뒤에 몇 가지 이유가 내가 좋아하는 뭔가 예상 한 것보다 수명이 긴 개체 변경하는 경우 :있는 유사한 쓰레기 수집 된 개체의 총 개수, 즉

Real: 00:00:02.908, CPU: 00:00:02.948, GC gen0: 212, gen1: 54, gen2: 1 

가 있지만, 함께 세대에 대한 1

아니면 그 숫자를 완전히 오해하고 있습니까? (설명서에서 설명을 찾을 수 없었습니다)?

UPDATE

으로는 나는 완전히 숫자를 오해 의견에서 지적했다 : 그들은 각 세대가 아닌 객체의 수에 대해 실행 가비지 수집의 수입니다.

나는 더 많은 당혹감을 안고있다. 나의 어플리케이션은 0 세대 가비지 콜렉션이 1 세대를 유발하는 상태에 메모리를 둔 것처럼 보인다. 나는이 상태가 무엇인지 상상할 수 없다. 행운을 불어 넣지 않고 이러한 동작을 재현하기 위해 다양한 테스트 프로그램을 시도했습니다.

의견과 패드의 대답에서 제안한대로 프로파일 러를 사용해 봐야합니다. 코멘트에 제안이

UPDATE는 내가 CLR 프로파일을 시도 - 그것을 할 내가 프로그램에 내 F 번호 스크립트를 변환 프로파일에서 실행.

내가 얻을이 보고서는 #time 하나의 완전히 다른 - 가비지 수집 :

  • 세대 0 : 279
  • 세대 1 : 5
  • 세대 2 : 2

Mistery - 독립 실행 형 프로그램과 비교하여 FSI.exe를 사용하면 부작용이 있습니까? #time에 버그가 있습니까?

+2

숫자는 실제로 해당 세대의 콜렉션 수입니다. 인쇄 기능은 https://github.com/fsharp/fsharp/blob/master/src/fsharp/fsi/fsi.fs - line 124에 있습니다. –

+1

또한 메모리 사용에 대해 정말로 염려하는 경우 CLR 프로파일 러 http://www.microsoft.com/en-us/download/details.aspx?id=16273은 얻을 수있는 것보다 훨씬 자세한 정보를 제공합니다. from # time' –

+0

GC 실행 횟수의 차이는 독립 실행 형 대 인터프리터라고 말할 수 있습니다. FSI의 GC 수에는 독립 실행 형 버전이 아닌 코드 컴파일/최적화와 관련된 GC가 포함되어 있습니다. GC 수를 살펴 보는 것이 좋은 성능 척도가 아니라는 것을 제안합니다. 실제 실행 시간은 훨씬 좋습니다. –

답변

2

.NET GC는 3 세대 GC입니다. 존 팔머 (John Palmer)가 지적했듯이,이 세 세대의 마지막 세 숫자는 the number of collections run입니다.gen1gen2의 숫자가 클수록 GC는 각 가비지 수집 프로세스에서 사용되지 않는 개체를 반복해서 표시해야하기 때문에 성능이 좋지 않음을 나타냅니다. .NET GC에 대한 심층적 인 소개는 this nice article을 참조하십시오.

  1. 하는 첫 번째 세션의 사용되지 않는 개체가 두 번째에 영향을주지 않도록 두 측정 사이에 "세션을 재설정"해야합니다 : 여기

    은 몇 가지 제안입니다.
  2. 측정 할 3 개의 큰 입력을 찾습니다. 이 두 보고서의 실행 시간은 비슷하지만 첫 번째 방법이 더 확장 가능할 것으로 기대됩니다. 확장 성을 테스트 할 수있는 입력 크기가 여러 개인 경우 유용합니다.
  3. 세션을 그냥 관찰 할 수 있으므로 패턴을 기록하기 위해 몇 번 측정하십시오.
  4. 의심되는 경우 Visual Studio에서 full-range profiling을 수행하십시오. 그들의 보고서는 성과 예측에 대해 훨씬 더 포괄적이고 신뢰할 수 있습니다.
+0

수집 된 개체의 수가 아니라 수집 된 개체의 수라고 생각합니다. http://msdn.microsoft .com/en-us/library/system.gc.collectioncount.aspx –

+0

@JohnPalmer : 고마워, 고쳤어. – pad