구현

17

을 treap 개선하는 것은 여기 (암시 적 키와 노드에 포함 할 몇 가지 추가 정보) treap의 종류의 내 구현의 : 데이터 GC 프로파일에 따르면 http://hpaste.org/42839/treap_with_implicit_keys구현

이 프로그램 시간의 80 %를합니다. 내가 아는 한, 노드가 '수정'될 때마다 루트 경로의 각 노드가 다시 생성된다는 사실이 원인입니다.

여기 성능 향상을 위해 할 수있는 일이 있습니까, 아니면 ST 모나드의 영역으로 내려 가야합니까?

+4

@adamax : 당신이 크리스 오카 사키에 의해 순수 기능 데이터 구조를 읽을 수있는이 문제는, 불변의 구조에 일반적입니다 (루트에 모든 것을 다시)? http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf 그는 이것에 대해 여러 논문을 썼다. –

+1

아마 내가 + RTS -s -RTS로 프로그램을 실행하여 이것을 검증해야합니다.이 80 %는 7.0.1을 사용하여 빠른 실행을했을 때 말하는데, 약 16 %의 시간을 보았습니다. GC에서. – ScottWest

+0

@ScottWest : ghc -O2 -prof --make test.hs로 컴파일하고 ./test + RTS -s -RTS로 실행하면 % GC 시간이 77.4 % (경과 된 시간 : 77.4 %)이고 총 시간은 8.7 초. 하지만 내 ghc 버전은 6.12.1입니다. 관심 없으면 시스템에서 총 시간은 얼마입니까? – adamax

답변

26

GHC 7.0.3을 사용하여, 나는 무거운 GC의 동작을 재현 할 수 있습니다

$ time ./A +RTS -s 
    %GC time  92.9% (92.9% elapsed) 
    ./A +RTS -s 7.24s user 0.04s system 99% cpu 7.301 total 

내가이 프로그램을 통해가는 10 분을 보냈다. 여기에 내가 위해, 무슨 짓을했는지 :

  • 설정 GHC의 -H 플래그는 GC에 한계를 증가
  • 는 1 세대 할당 영역을 조정
  • 를 인라인 개선 풀고 확인

결과적으로 10 배의 속도 향상, GC는 약 45 %의 시간 증가를 가져옵니다. 위해


, GHC의 마법 -H 플래그를 사용하여, 우리는 그 실행 시간을 상당히 줄일 수 있습니다 : 나쁜

$ time ./A +RTS -s -H 
    %GC time  74.3% (75.3% elapsed) 
    ./A +RTS -s -H 2.34s user 0.04s system 99% cpu 2.392 total 

을!

Tree 노드의 UNPACK pragma는 아무 것도하지 않으므로 제거하십시오. 우리는 할당을 테스트하고 있기 때문에, 결국 -이 빠른 반면, GC는 여전히 압도하지 그래서 height

./A +RTS -s -H 1.74s user 0.03s system 99% cpu 1.777 total 

를 인라인으로

./A +RTS -s -H 1.84s user 0.04s system 99% cpu 1.883 total 

:

인라인 update 더 런타임을 면도 .

./A +RTS -s -A100M 0.74s user 0.09s system 99% cpu 0.826 total 

, 우리가 시작보다 10 배 빠른 무엇 인, JohnL이 제안,

$ time ./A +RTS -s -A200M 
%GC time  45.1% (40.5% elapsed) 
./A +RTS -s -A200M 0.71s user 0.16s system 99% cpu 0.872 total 

그리고 전개 임계 값을 증가 조금 도움 : 우리가 할 수있는 것은 첫 번째 세대의 크기를 증가입니다 ? 나쁘지 않다. ghc-gc-tune를 사용


, 당신은 흥미롭게도

Time and GC

는 최고의 실행 시간이 예를 들어, 매우 큰 -A 값을 사용 -A-H의 함수로 런타임을 볼 수 있습니다

$ time ./A +RTS -A500M 
./A +RTS -A500M 0.49s user 0.28s system 99% cpu 0.776s 
+0

와우, 정말 놀라워! ghc 6.12.1과 비슷한 동작을합니다. 가장 빠른 속도 향상은'update' 인라이닝과 첫 번째 gen 크기 설정입니다. 한가지 질문은 -H에'size' 옵션을 포함시키는 것을 잊었습니까? -H는 아무것도하지 않는 것처럼 보이지만 -H64m은 그렇습니다. – adamax

+1

GHC 7에서 -H는 GC에 대한 모든 제한을 늘립니다. –

+3

보다 정확하게, -H는 일종의 "자동 -A"이며 전체 메모리 사용량을 증가시키지 않고 -A 설정을 증가시킵니다. 이는 GC를 복사하기 때문에 가능합니다. 따라서 주요 GC간에 사용되지 않는 많은 메모리가 있습니다. -A를 늘리는 것은 항상 좋은 생각은 아닙니다. 일부 프로그램에서는 캐시 미스 (cache miss)가 증가하여 상황이 더욱 악화됩니다. –