Gauche > Archives > 2013/06/05

2013/06/05 06:57:13 UTCyamasushi
#
CSVの件、with-input-from-portをつかわずに、直接portを引数に渡したら、速くなりました。memory 2G,Celeron(R) M 1.60GHz,Ubuntu 12.04 32bit, ken_all.csvで、
#
$ gosh csv/test-csv ken_all.csv
;(time (read-data reader (cadr args)))
; real   8.223
; user   7.470
; sys    0.240
 
$ gosh csv/test-csv ken_all.csv
;(time (read-data kaizou:reader (cadr args)))
; real   7.333
; user   6.900
; sys    0.270 https://gist.github.com/yamasushi/5712069
2013/06/05 10:50:20 UTCyamasushi
#
時間の性能はtimeをつかって調べるのですが、空間の性能はどうやればいいのでしょうか? twitterの会話をちらちらみながらコマンドを打ってみるのですが、どうもよくわからないのです。
2013/06/05 10:53:42 UTCshiro
#
ふむ、案外変わるものですね。これだけ速くなるならportを引き回してもいいかな。with-output-portを使ったのはその方がコードが簡潔になるためですが、1行毎にクロージャ+rewind handlerが作られるのが重いのかも。
#
空間プロファイラは欲しいんですがまだ作って無いです。(gc-stat)するとこれまでの総アロケート量が取れるので適宜差分を見ればどのくらいアロケートされたかはわかります。あとgoshに-fcollect-statsをつけて起動すると、終了時にちょっと情報が出ますが、今はまだ大したものはないです。
2013/06/05 11:10:14 UTCshiro
#
s/with-output-port/with-input-from-port/ だた
2013/06/05 11:13:02 UTCyamasushi
#
ありがとうございます。gc-statを試してみました。 ((:total-heap-size 128815104) (:free-bytes 13176832) (:bytes-since-gc 37375072) (:total-bytes 201361744)) これらのどの数字が重要なのでしょうか?
2013/06/05 11:16:35 UTCshiro
#
どれが重要かはあなたが何を見たいかですが、total-heap-sizeはヒープ(プロセスがOSから確保しているメモリ)の量、free-bytesはその中でまだ使ってないメモリ量、bytes-since-gcは最後のgcから何バイトアロケートしたか、total-bytesがプロセス起動後のアロケートの総量です。頻繁にアロケートするけどすぐゴミになって回収されるプロセスの場合はtotal-bytesがどんどん増えるけどtotal-heap-sizeは頭打ちになる。アロケートしたやつがずっとgcされないで残る場合はtotal-heap-sizeが増えてゆく、みたいな感じですね。
2013/06/05 11:20:07 UTCyamasushi
#
なるほど。そういう風に読めばいいのですね。(使用メモリだけでいいのかなと素朴に考えていました。)
2013/06/05 16:55:06 UTC齊藤
#
Boehm GC はオブジェクトの再配置はしないので、 gosh を起動したら終了するまで total-heap-size が減ることはないと考えていいんですよね
2013/06/05 19:17:27 UTCshiro
#
理屈の上ではmmapしたチャンクの中身が全部ごみとして回収されたらmunmapで返却できるので減ることはありえますが、今ざっとコードをみたところそれはやってない感じ。ただtotal-heap-sizeなどはBoehm GCの返す値をそのまま返してるんで、値の正しい意味はBoehm GCがどうそれを計算してるかに依存します。
2013/06/05 23:18:56 UTCyamasushi
#
どうもよくわからないのですが、昨日の改造をしたら、確保メモリ量が変わるのですが、これはなぜなのでしょう? https://gist.github.com/yamasushi/5718069 数字の読み方が悪いのかしらん。
#
(gc)しているから同じになるだろうと考えたのですが・・・・
2013/06/05 23:57:32 UTCshiro
#
昨日の改造ってどれですか。with-input-from-portを使わないやつのこと? 具体的に指してもらわないとわからんです。
#
with-input-from-portを使うと、1行読む度にクロージャおよびハンドラチェインのアロケートが入るので、それを省略した方が消費メモリが少なくなるのは確かです。あとGCはインクリメンタルに走るのでタイミングによってヒープ量は変わり得ます。