##まず、もともとのプログラムは Mac OS X Lion(Darwin Kernel Version 11.2.0) で動かしていまして、homebrew 経由でインストールした Gauche を使っていました。バージョンは Gauche scheme shell, version 0.9.2 [utf-8,pthreads], i386-apple-darwin11.2.0 です。で、gosh に ptime オプションを付けて起動してみたのですが、プロファイリング結果が空でした。僕の環境ではプロファイリングはできないようです。
#で、一応 Mac 上に VirtualBox で Debian/Squeeze な環境を作成してプロファイリングをしてみたので、そちらの結果を貼り付けます。
#・Gaucheのバージョン
Gauche scheme shell, version 0.9 [utf-8,pthreads], x86_64-pc-linux-gnu
・プログラム
(use text.csv)
(define log-reader (make-csv-reader #\tab))
(define (log-file->list log-file-path)
(call-with-input-file log-file-path
(lambda (port)
(port-map
(lambda (ls) (list->vector ls))
(lambda () (log-reader port))))))
(define (main args)
(log-file->list "hoge.log"))
・入力データ
各行140バイト程度の197350行あるタブ区切りのcsvデータ
#Profiler statistics (total 14715 samples, 147.15 seconds)
num time/ total
Name calls call(ms) samples
---------------------------------------------------+------+-------+-----------
string-trim-right 5723150 0.0040 2280( 15%)
string-trim 5723150 0.0035 2016( 14%)
string-prefix? 5723150 0.0032 1806( 12%)
string-index 5723150 0.0029 1688( 11%)
make-string-pointer 28615750 0.0005 1387( 9%)
(make-csv-reader make-csv-reader start) 5723150 0.0014 811( 6%)
%string-prefix-int 5723150 0.0013 726( 5%)
%maybe-substring 33944200 0.0002 670( 5%)
string-pointer-substring 11446300 0.0005 616( 4%)
char=? 33467508 0.0002 568( 4%)
string-pointer-next! 50834308 0.0001 323( 2%)
string-drop 5525800 0.0004 221( 2%)
string-length 11051600 0.0002 189( 1%)
string-take 5525800 0.0003 161( 1%)
(string-index pred) 27744358 0.0001 159( 1%)
char-set-contains? 11446300 0.0001 159( 1%)
list->vector 197350 0.0079 156( 1%)
read-line 197351 0.0077 151( 1%)
string-pointer-prev! 11446300 0.0001 146( 1%)
string-pointer-index 11248950 0.0001 144( 1%)
char-set? 11446300 0.0001 113( 1%)
(string-trim-right pred) 5723150 0.0002 86( 1%)
(string-trim
#ありがとうございます。とても参考になります。あとOSX Lionでプロファイリングが出来ないという情報も重要です。こちらは他のOSXerの方たちにお尋ねしたいところ。
#すみません、途中で切れてしまったので、今更ですがWikiにページを作成して詳細なプロファイル結果をまとめておきます。
#string-trim系は多用する手続きだからチューニング効果は高そうだ。
#わざわざVM環境までセットアップして計測していただき、ありがとうございます。
#あと、もう一点気になることがありまして、上記方法でインストールした Mac OS X Lion の Gauche で、
#(use gauche.time)
(time (car '(a b c d)))
#を実行すると下記のエラーが出ます。
#gosh: "error": failed to link /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.2.0/gauche--auxsys.so dynamically: dlopen(/usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.2.0/gauche--auxsys.so, 10): Symbol not found: _environ
Referenced from: /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.2.0/gauche--auxsys.so
Expected in: flat namespace
in /usr/local/Cellar/gauche/0.9.2/lib/gauche-0.9/0.9.2/i386-apple-darwin11.2.0/gauche--auxsys.so
#ありゃenvironが無いのかな。
#そのエラーは他の人も遭遇してるみたいですね。
##ext/auxsys/auxsys.cの42行目をextern char **__environ; にしたらどうなりますかね > OSX Lionな方
#私の環境(MacOSX 10.7.2)だと、(time (car '(a b c d)) は動くようです。自分で0.9.2をコンパイルしたものです。
#-ptime は、時間が全部0になっていますね。num callsは出てきます。
#lolouila:maru% uname -a [~]
Darwin lolouila.local 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug 9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64
lolouila:maru% type gosh [~]
gosh is /opt/local/bin/gosh
lolouila:maru% gosh [~]
gosh> (gauche-version)
"0.9.2"
gosh> (use gauche.time)
#<undef>
gosh> (time (car '(a b c d)))
;(time (car '(a b c d)))
; real 0.000
; user 0.000
; sys 0.000
a
gosh>
#MacOSX 10.7.2, MacPortsから入れたGauche 0.9.2でもエラーにはならない様子
#homebrewとMacPortsってのは違うの?
##何でひとつのOSにパッケージマネジャが2つもあるんじゃい、という感じはありますがそれぞれ別のものです
#ってことはhomebrewの方のビルドが何かやってるのかなあ。koguroさんはソースからコンパイルしてエラーが出てないから。
#まずはHomebrewのビルドプロセス側を調べる必要がありそうです。
#lolouila:maru% ./gosh -ftest [~/Downloads/Gauche-0.9.2/src]
gosh> (use gauche.time)
#<undef>
gosh> (time (car '(a b c d)))
;(time (car '(a b c d)))
; real 0.000
; user 0.000
; sys 0.000
a
gosh>
#0.9.2のtarballから./configure; make; make checkしてno errorな状態で試してみましたがエラーは出ないです
#前に10.6.8(SnowLeopard)のhomebrewでビルドした時も同じエラー出たんで素直に自分でビルドした記憶が。
#スミマセン。寝落ちします。
#こんにちは。
homebrew はインストール時に gosh を strip していて、
どうもそれが原因ではないかと思われます。
自分でビルドした場合でも、src ディレクトリに降りて
% strip gosh
することで再現しました。
#% cd src
% ./gosh -ftest
gosh> (use gauche.time)
#<undef>
gosh> (time (car '(a b c d)))
;(time (car '(a b c d)))
; real 0.000
; user 0.000
; sys 0.000
a
gosh>
% strip gosh
% ./gosh -ftest
gosh> (use gauche.time)
#<undef>
gosh> (time (car '(a b c d)))
*** ERROR: failed to link ../src/gauche--auxsys.so dynamically: dlopen(../src/gauche--auxsys.so, 10): Symbol not found: _environ
Referenced from: /Users/ktgy1016/Downloads/Gauche-0.9.2/ext/auxsys/gauche--auxsys.so
Expected in: flat namespace
in /Users/ktgy1016/Downloads/Gauche-0.9.2/ext/auxsys/gauche--auxsys.so
Stack Trace:
_______________________________________
0 (sys-times)
[unknown location]