From: Hidetoshi NAGAI Date: 2008-03-26T19:29:43+09:00 Subject: [ruby-dev:34144] [質問2点] C からの定数参照 & thread switching コストの低減 永井@知能.九工大です. すみませんが,2点質問させてください. まず1点目です. ---[質問1]----------------------------------------------------- C 言語で書かれた関数に "::AAA::BBB::CCC" という形で 定数/クラス/モジュールのパス文字列が渡された時, 対象となるオブジェクトを得るための低コストな実装は どのように書くべきでしょうか. ただし,対象となるオブジェクトはこの検索の際に autoload で読み込まれる可能性があるため, autoload の機構はきちんと働く必要があります. また,定数が存在しないなどの例外も捕捉せねばなりません. 単純な方法なら,rb_eval_string_protect(str, &state) かなとは 思うのですが... ---------------------------------------------------------------- 次に2点目です. ---[質問2]----------------------------------------------------- thread A から thread B に処理を依頼し,その結果を thread A で 受け取りたいという場合についてです. thread B は複数の thread からの依頼を受け付けるため, thread A からの依頼を処理した後は速やかに別の依頼を 処理する必要があります. また,thread B には local に処理すべき仕事 (アプリケーション全体で見ても比較的優先順位が高い) もあります. このような場合の実行コストをうまく低減して, アプリケーション全体の速度低下を抑えるための うまい方法はないでしょうか. thread 切り替えの頻度を下げると, 処理依頼に対する待ち時間が増加して低速化します. かといって,頻度を上げると thread 切り替えのコストが大きくて 遅くなってしまいます. thread B には優先順位が高めの local の仕事はありますが, 処理のない「暇」な時間も頻繁に発生します. しかしその度に他の thread に処理を譲ってしまうと, 優先順位が高めの local の仕事への応答性が低下し, アプリケーション全体の動作が鈍くなってしまいます. なお,local の仕事が発生したかどうかを 外部からモニターすることはできません. Ruby が Giant Lock での thread 切り替え動作である以上は, こうした速度低下は避けようがないことなのでしょうか. ---------------------------------------------------------------- この2点目は,ご想像の通り,Ruby/Tk の eventloop の処理の話です. あるスクリプトの実行環境を包み込むために thread でくるんで実行するようにした場合, eventloop の thread との間に激しいメッセージの応酬が行われて 目に見えて処理速度が低下してしまいます. GUI の構築の際には,依頼→戻値受け取り→戻値に基づいての依頼 というのが頻繁に行われるために顕著に遅くなります. GUI の構築が完了してしまえば,通常はスクリプト側からの 処理依頼は激減するので,速度低下はほぼ問題にならないようです. 現在の eventloop では,連続処理数 (処理がない時には多く増加させる) と タイマーとの組合わせで,切り替えのタイミングを スクリプトからある程度コントロールできるようにはしていますが, どのような値にすべきかの根拠があるわけでもなく, 場当たり的な対応に過ぎないことが気になっています. ですので,「そうした場合はこうすべき」というのがあれば ぜひ教えを請いたいと思っています. よろしくお願いします. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp