From: Shin-ichiro HARA Date: 2002-08-07T14:38:00+09:00 Subject: [ruby-dev:17955] Re: import-module (Re: Re: scope-in-state) 原です。 >けいじゅ@日本ラショナルソフトウェアです. > >import-module でも、例えば [クラス, モジュール] の配列の配列を引数に > >して > >(中略) > > >で、複数のインクルードができはするのですが、もっとシステマティックにや > >りたいわけですね。 > >そうですね. import_moduleは import_moduleでモジュールを指定するわけで, >ライブラリを使う側がincludeしたいモジュールを指定するわけですよね. >scope-in-stateはライブラリを提供する側があらかじめ変更したい振る舞いを >宣言しています. で利用者側はその宣言されたものだけを使います. その辺り >の感覚が違うんだと思いますね. なーるほど、よく分かりました。それに比べると import-module はどちらかと いうと既にあるプログラムに対するパッチ感覚です。でも、例えば def nested_modules(mod) aa = [] mod.constants.each do |c| m = mod.const_get(c) mod0 = eval m.name.sub(/[^:]*/, '') if m.instance_of?(Module) if m != mod aa << [mod0, m] aa.concat nested_modules(m) end end end aa end とか作って、[ruby-dev:17943]の import-modules に渡せば、scope-in-state 相当になるんですけどね。だから import-modules からは、scope-in-state は一つのアプリケーションに見えなくもない。 >もともとのアイディアがclass-in-stateなわけですが, UMLでこういうものが >ある理由は, Rubyのクラスのように動的に振る舞いを変えることのできるクラ >スはUMLのクラス図ではまともに表現できません. かといって, やはりクラス >図で表現したいというときに用いる手段として存在しています. ですので, >scope-in-stateも静的に表現できるってところにこだわっています. なるほど。 >私も実装をどうやったのか覚えていなくて, 思い出すのに苦労しました. 私の >もですが, 原さんのも理解するのが難しい実装ですよね(^^;;; すいません。あまりに未整理のまま人に読ませてしまったので、反省して ます。今 Ver. 0.16 を作りました。こっちは2倍(当校比)読みやすい はずです。これで scope-in-state と同じぐらいの読みにくさかと。:-) >ところで, scope-in-stateにメソッドキャッシュを導入してみました. これだ >と, multi-thread版のimport-moduleと同じぐらいになりました. これがこの >タイプの実装の限界でしょうかね. どうやっても, single-thread版なみには >ならないでしょうね(^^;;; >keibm% ruby -I import-module-0.12 import-module-0.12/test-time.rb 0 >multi thread(scopes in 1000 loops) : 9.9948 >multi thread(1000 loops in a scope) : 0.0600 >keibm% ruby -I import-module-0.12 import-module-0.12/test-time.rb 9 >single thread(scopes in 1000 loops) : 5.6054 >single thread(1000 loops in a scope) : 0.0067 >keibm% ruby -I import-module-0.12 import-module-0.12/test-time.rb 8 >scope in state(scopes in 1000 loops) : 0.2268 >scope in state(1000 loops in a scope) : 0.1880 > ># 新scope-in-state >keibm% ruby -I import-module-0.12 import-module-0.12/test-time.rb 7 >scope in state 2(scopes in 1000 loops) : 0.2414 >scope in state 2(1000 loops in a scope) : 0.0429 おかしい〜、import-module が負けるなんて!! というわけで負けじとキャッシュもどきを実装してみました。multi-thread (1000 loops in a scope)で3倍近く早くなりました。 VER. 0.12 $ ruby -I import-module-0.12 test-time.rb 0 multi thread(scopes in 1000 loops) : 10.8445 multi thread(1000 loops in a scope) : 0.0619 $ ruby -I import-module-0.12 test-time.rb 9 single thread(scopes in 1000 loops) : 5.5303 single thread(1000 loops in a scope) : 0.0061 VER. 0.16 $ ruby test-time.rb 0 multi thread(scopes in 1000 loops) : 5.3673 multi thread(1000 loops in a scope) : 0.0223 $ ruby test-time.rb 9 single thread(scopes in 1000 loops) : 3.9388 single thread(1000 loops in a scope) : 0.0044 ># でも, もっと良い実装のアイディアが出ましたので, もうちょっと頑張って ># みます. いやあ、もう限界だと思うけど、、、いったい何でしょう。興味津々。 これ以上難しくなりませんように。:-)