From: Koji Arai Date: 2000-01-26T00:16:24+09:00 Subject: [ruby-list:20386] Re: Ruby/Tk multi interpreter 新井です。 >>> From: Koji Arai >>> Date: 24 Jan 2000 23:10:51 +0900 >>> Subject: [ruby-list:20364] Re: Ruby/Tk multi interpreter > 新井です。 > で、調べて一番重そうな部分にprofileを実行してみました。 良く見ると、TkObject#bind (_bind_core)の実行回数が極端に多かったです。 > % cumulative self self total > time seconds seconds calls ms/call ms/call name > 35.68 227.15 227.15 2167 104.82 161.13 #._get_eval_string > 11.21 298.52 71.37 10770 6.63 6.85 String#== > 7.25 344.65 46.13 562 82.09 800.42 #.tk_call > 7.18 390.37 45.72 7123 6.42 6.42 wm.kind_of? > 5.30 424.13 33.77 562 60.08 681.23 Array#filter > 2.22 438.25 14.12 173 81.60 1257.23 #._bind_core [ruby-dev:8905]で永井さんに作ってもらったTkBindCore でクラス にbindするようにスクリプトを修正すればかなり改善されそうです。 ちなみに、自宅のLinuxだと処理全体の実行時間は o 修正前 real 0m4.540s user 0m3.380s sys 0m0.180s # うっマシンの差が歴然としてる(10倍以上 - -;) o 修正後 real 0m2.848s user 0m1.990s sys 0m0.190s でした。結構期待できそうです。 おまけで、ささやかながら最後のパッチを付けるとString#==、 kind_of?や、respond_to?の実行回数がかなり減ります。 real 0m2.795s user 0m1.990s sys 0m0.150s 以下が最終的なprofileです。明日あたり会社の鈍亀マシンでも試 して見ます。 % cumulative self self total time seconds seconds calls ms/call ms/call name 24.13 6.62 6.62 1527 4.33 6.42 Tk._get_eval_string 12.52 10.05 3.43 402 8.54 40.75 Tk.tk_call 8.75 12.45 2.40 3693 0.65 0.77 String#== 6.44 14.22 1.77 402 4.39 28.73 Array#filter 4.26 15.38 1.17 9 129.63 538.89 main.require 4.01 16.48 1.10 135 8.15 55.31 TkObject#configure 4.01 17.58 1.10 201 5.47 97.35 Object#initialize 2.61 18.30 0.72 1523 0.47 0.47 String#to_s --- /usr/local/lib/ruby/1.4/tk.rb Wed Jan 19 22:41:54 2000 +++ tk.rb Tue Jan 25 22:54:43 2000 @@ -196,7 +196,9 @@ module TkComm def _get_eval_string(str) return nil if str == None - if str.kind_of?(Hash) + if str.kind_of?(String) + str = str.to_s + elsif str.kind_of?(Hash) str = hash_kv(str).join(" ") elsif str.kind_of?(Array) str = array2tk_list(str) -- 新井康司 (Koji Arai)