[ruby-dev:49290] [Ruby trunk - Bug #11559] [Assigned] ビジーループの thread と YAML.parse を組み合わせたときの実行時間が 2.2.3 で遅くなっている
From:
kosaki.motohiro@...
Date:
2015-10-08 16:23:07 UTC
List:
ruby-dev #49290
Issue #11559 has been updated by Motohiro KOSAKI. Status changed from Open to Assigned Assignee set to Nobuyoshi Nakada エスパー能力により r50887 [Bug #11060] だと分かりました。 ためしにprintf入れてみたところ、yaml.loadの延長で結構な数の loadopen_func 処理(メッセージ末尾に貼ります)が走っており、 それが毎回GVL switchをするようになったので、なにもしてないスレッドにたくさん時間が渡る結果になったようです。 で、根本原因はといいますと、utf_16le, utf_16be の2つをloadしたいだけなのに、pathの都合で、16回ほどGVLを取ったり 話したりしてるわけですよ。つまり require自体が全体的に遅くなってる。 r50887 は stable branch では一旦revert, [Bug #11060] は reopenのうえ、trunkで再修正を動議します。 ----------------------- /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/2.3.0/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/2.3.0/x86_64-linux/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/2.3.0/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/2.3.0/x86_64-linux/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/2.3.0/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/2.3.0/x86_64-linux/enc/utf_16le.so /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/2.3.0/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/2.3.0/x86_64-linux/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/site_ruby/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/2.3.0/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/2.3.0/x86_64-linux/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/vendor_ruby/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/2.3.0/enc/utf_16be.so /home/kosaki/local/ruby-trunk/lib/ruby/2.3.0/x86_64-linux/enc/utf_16be.so ---------------------------------------- Bug #11559: ビジーループの thread と YAML.parse を組み合わせたときの実行時間が 2.2.3 で遅くなっている https://bugs.ruby-lang.org/issues/11559#change-54394 * Author: 三村 益隆 * Status: Assigned * Priority: Normal * Assignee: Nobuyoshi Nakada * ruby -v: 2.2.3 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- ビジーループするスレッドと YAML.parse を並行して実行するような以下のようなコードが 2.2.2 と 2.2.3 で、 数倍遅くなっているようです。trunk でも遅いことを確認してます。 ~~~ require 'thread' require 'yaml' puts RUBY_VERSION y = (1..1000).to_a.to_yaml t = Thread.new do while true; 1;end end 10.times do YAML.load(y) end t.kill ~~~ 実行結果 ~~~ $ time ruby thread_loop_with_while.rb 2.2.2 ruby thread_loop_with_while.rb 0.30s user 0.06s system 94% cpu 0.375 total $ time ruby thread_loop_with_loop.rb 2.2.3 ruby thread_loop_with_loop.rb 1.80s user 0.05s system 99% cpu 1.864 total ~~~ -- https://bugs.ruby-lang.org/