永井@知能.九工大です. From: Nobuyoshi Nakada <nobu / ruby-lang.org> Subject: [ruby-dev:39355] Re: [ruby19] Thread 切替えが異常に遅い? Date: Sun, 20 Sep 2009 19:21:53 +0900 Message-ID: <4ab6023e.9613f30a.34f3.ffff9f7e / mx.google.com> > At Sun, 20 Sep 2009 12:27:48 +0900, > Hidetoshi NAGAI wrote in [ruby-dev:39352]: > > 忙しくて暫く放置していて,今日,久しぶりに動かしてみたのですが, > > 今の 1.9 って,Thread 切替えがものすごく遅くなっていたりしますか? > > > > ruby 1.9.2dev (2009-09-19) [i686-linux] で試していたのですが, > > 次のスクリプト (1) であれば,1.8 と同様にすぐにウィンドウが出ます. > > ですが, > > -----(2)----------------------------------------------------- > > や > > -----(3)----------------------------------------------------- > > ではとんでもなく遅くなってしまいます. > > 手元で試した限り、linuxでlocalhost、あるいはMac OS Xでmactkでは > 差はわかりません。ただ、linuxからOS XのX11に出すときには(1)と > (3)では6~7秒程度なのに対して(2)は十数秒近くかかりました。 そうですか. 手元の環境が古いことによる違いもあるのかもしれませんね. ちなみに手元の環境は Vine 3.2 ベースで kernel は 2.6.15.4, rpm -q glibc の答えは glibc-2.3.3-3vl1.3 です. こちらでは 1.8 や (1) では 1 秒以内に表示を完了するのに対し, (2) や (3) は表示完了までに 5 秒程度かかります. 別マシンの X に表示させる場合については, このメールを書いている現在は 2nd マシンがなく, テストできる環境にありません. 以下は念のためですが.Ruby/Tk において TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD == true の場合というのは イベントループの実体が Tk.mainloop で動いている状態です. この時には Thread.new{Tk.mainloop} などとして メインスレッド以外で Tk.mainloop を動かすようなことは許されません. そうでない場合 (1.9 でのデフォルト) には, tk.rb の require 時にイベントループの実体となるスレッド (Tk インタープリタの初期化も同スレッド上で行われる) を起動しておき, Tk.mainloop は単なる待ちを行うだけとなっています. このようになっている理由は, Tk は Tk の初期化を行った native thread 上でしか 正しく動作しないためです. イベントループとは異なる native thread からの呼び出しは イベントループの native thread に送られて処理されます. もちろん,処理を依頼した方の native thread は 結果を受け取るまで待ち状態となります. サンプル (2) と (3) とはこの状態です. -- 永井 秀利 (nagai / ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系 知能情報メディア部門