필자는 상당히 복잡한 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
에 버그가 있습니까?
숫자는 실제로 해당 세대의 콜렉션 수입니다. 인쇄 기능은 https://github.com/fsharp/fsharp/blob/master/src/fsharp/fsi/fsi.fs - line 124에 있습니다. –
또한 메모리 사용에 대해 정말로 염려하는 경우 CLR 프로파일 러 http://www.microsoft.com/en-us/download/details.aspx?id=16273은 얻을 수있는 것보다 훨씬 자세한 정보를 제공합니다. from # time' –
GC 실행 횟수의 차이는 독립 실행 형 대 인터프리터라고 말할 수 있습니다. FSI의 GC 수에는 독립 실행 형 버전이 아닌 코드 컴파일/최적화와 관련된 GC가 포함되어 있습니다. GC 수를 살펴 보는 것이 좋은 성능 척도가 아니라는 것을 제안합니다. 실제 실행 시간은 훨씬 좋습니다. –