Here is the full repository. 이것은 postgresql-simple 데이터베이스 바인딩을 사용하여 50000 개의 임의의 것들을 데이터베이스에 삽입하는 매우 간단한 테스트입니다. 그것은 MonadRandom을 사용하고 게으른 것을 생성 할 수 있습니다.이 코드는 왜 많은 양의 힙을 소비합니까?
Here is the lazy Thing generator.
insertThings c = do
ts <- genThings
withTransaction c $ do
executeMany c "insert into things (a, b, c) values (?, ?, ?)" $ map (\(Thing ta tb tc) -> (ta, tb, tc)) $ take 50000 ts
Here is case2, 단지 표준 출력에 물건을 덤프 : : 나는 아주 나쁜 GC 시간이 첫 번째 경우
main = do
ts <- genThings
mapM print $ take 50000 ts
: 것 생성기를 사용하여 코드의
Here is case1 특정 조각
cabal-dev/bin/posttest +RTS -s
1,750,661,104 bytes allocated in the heap
619,896,664 bytes copied during GC
92,560,976 bytes maximum residency (10 sample(s))
990,512 bytes maximum slop
239 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 3323 colls, 0 par 11.01s 11.46s 0.0034s 0.0076s
Gen 1 10 colls, 0 par 0.74s 0.77s 0.0769s 0.2920s
INIT time 0.00s ( 0.00s elapsed)
MUT time 2.97s ( 3.86s elapsed)
GC time 11.75s (12.23s elapsed)
RP time 0.00s ( 0.00s elapsed)
PROF time 0.00s ( 0.00s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 14.72s (16.09s elapsed)
%GC time 79.8% (76.0% elapsed)
Alloc rate 588,550,530 bytes per MUT second
Productivity 20.2% of total user, 18.5% of total elapsed
두 번째 경우에는 시간이 많이 걸리는 반면 :
cabal-dev/bin/dumptest +RTS -s > out
1,492,068,768 bytes allocated in the heap
7,941,456 bytes copied during GC
2,054,008 bytes maximum residency (3 sample(s))
70,656 bytes maximum slop
6 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 2888 colls, 0 par 0.13s 0.16s 0.0001s 0.0089s
Gen 1 3 colls, 0 par 0.01s 0.01s 0.0020s 0.0043s
INIT time 0.00s ( 0.00s elapsed)
MUT time 2.00s ( 2.37s elapsed)
GC time 0.14s ( 0.16s elapsed)
RP time 0.00s ( 0.00s elapsed)
PROF time 0.00s ( 0.00s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 2.14s ( 2.53s elapsed)
%GC time 6.5% (6.4% elapsed)
Alloc rate 744,750,084 bytes per MUT second
Productivity 93.5% of total user, 79.0% of total elapsed
힙 프로파일 링을 적용하려했지만 아무 것도 이해하지 못했습니다. 그것은 50000 건 모두가 메모리에서 먼저 생성 된 다음 쿼리가있는 ByteString으로 변환 된 다음이 문자열이 데이터베이스로 보내집니다. 그런데 왜 그렇게됩니까? 유죄 판결을 내리는 방법은 무엇입니까?
GHC 버전은 7.4.2
편집 앨범 플래그 내가 formatMany 및 50K 것들과 프로필을 확인했습니다 (샌드 박스에 음모-DEV에 의해 컴파일 된) 모든 라이브러리 및 패키지 자체
첫 번째 사례와 두 번째 사례간에 어떤 코드가 다른지 이해할 수 없습니다. 1) 자체 포함 된 코드 또는 적어도 명시적인 문구를 사례에 게시 할 수 있습니까? 2) GHC 버전 3) 컴파일러 플래그. –
이것은 나에게 거의 힙을 사용하지 않고 - 최적화없이 컴파일하고 있습니까? 그것은 문제가 될 것입니다. –
-O2를 사용하여 모든 라이브러리를 다시 컴파일했지만 효과가 없습니다. – s9gf4ult