From: EGUCHI Osamu Date: 1997-09-30T15:41:39+09:00 Subject: [ruby-dev:592] Re: optimize (Re: Assigne to special variable) えぐち です。 ---------- > 差出人 : Yukihiro Matsumoto > 件名 : [ruby-dev:588] Re: optimize (Re: Assigne to special variable) > > まつもと ゆきひろです > > In message "[ruby-dev:586] Re: optimize (Re: Assigne to special variable)" > on 97/09/30, Yukihiro Matsumoto writes: > > |まつもと ゆきひろです > > ||> それとキーワード判定ってそんなに重くないような気がするんです > ||> けど.重くなければ複雑になるだけですよね. > || > ||ところが、yylex の実行時間の殆どは2分探査が占めてました。 > ||で yylex は、全体のいくらかというと、、ベストテン圏内に登場することも > ||まずらしくないようです。(みぢかいスクリプトではあれですが、) > | > |そうか,それは考えた方が良いかも. > > うちにも gperf がインストールしてあったので,ちょっと使って > 見ました,なかなか面白いですね. gperf は、gcc 自身の生成に必要なので gcc の走るプラットホームには よくインストールされています。 2分探査は高速なアルゴリズムですが、さすがに完全ハッシュの方が 速いですし、レイテンシーがフラットなのがいいです。 > でも,手元にある900行くらいのスクリプトでは有意な差は出なかっ > たんですねえ.確かに速くなっているようなんですけど,せいぜい > 数ミリ秒くらいでした.今後の使い勝手などを考えると変更する価 > 値があるのだろうか,という感じでしたね.もうちょっと検討して > みましょう. じつは、自分のパッチでは if/unless/while/until の例外を表駆動に 変更したのでそれも効いているです。一遍にやってので分離したデータを 持ってないです。^^; > ところで,えぐちさんのお使いのプロファイラやカバレージツールっ > てなんなんでしょう? すごく正確な値が出てるみたいですけど. プロファイラは、FreeBSD の /usr/bin/gprof です。 env CFLAGS='-pg -O2' ./configure な ruby を走らすだけです。 sunos では GNU-gprof です。基本的に同じですけど。 カバレジテスタは、 gcov です、*次の* リリースの gcc に含まれます。 pgcc とか egcs という gccの改造をしているプロジェクトの 中間成果に含まれています。 env CC=gcc-test CFLAGS='-fprofile-arcs -ftest-coverage' \ ./configure ってかんじです。 こんなもの取れます。 --- static VALUE rb_eval(self, node) VALUE self; NODE * volatile node; { 129541 NODE *state; 129541 volatile VALUE result = Qnil; #define RETURN(v) { result = (v); goto finish; } again: 142971 if (!node) RETURN(Qnil); #if 0 sourceline = nd_line(node); sourcefile = node->file; #endif 142736 switch (nd_type(node)) { 553 case NODE_BLOCK: 553 while (node) { 2118 result = rb_eval(self, node->nd_head); 1922 node = node->nd_next; 1922 } 357 break; /* begin .. end without clauses */ case NODE_BEGIN: ###### node = node->nd_body; ###### goto again; --- あと SunOS の tcov でも同じように測れると思います。 ruby は幸い KnR1 でかかれているので古き良き SunCC でも コンパイルできるので tcov もOKでしょう。 (SunOS4 自体が絶滅しなければいいんですが、because I love BSD!! ) # ruby にスクリプトのプロファイルやカバレジテストの機能を 付けようと一瞬思ったのですが、 thread でめげました。 えぐち