From: kosaki.motohiro@... Date: 2015-10-17T21:30:52+00:00 Subject: [ruby-dev:49305] [Ruby trunk - Bug #11559] ビジーループの thread と YAML.parse を組み合わせたときの実行時間が 2.2.3 で遅くなっている Issue #11559 has been updated by Motohiro KOSAKI. 調査してみたところ、今回のケースではGVLの所有権変更はすべてIO.closeを契機に行われており、 要するにopenの回数が変わっているのですが、それはなにかというと did_you_mean. gem_prelude.rbから require 'did_you_mean' を削除してみたところ、以下のように性能劣化が なくなりました。 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.527653928 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.426449087 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 2.638254863 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.828310768 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.625604287 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.525134804 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.324337379 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.231783409 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 2.652402031 ruby 2.0.0p598 (2014-11-13) [x86_64-linux] 1.120792229 built-ruby 1.939639205 built-ruby 2.936679158 built-ruby 2.339801367 built-ruby 1.252506794 built-ruby 2.64641999 built-ruby 0.936793636 built-ruby 3.960754206 built-ruby 2.346939978 built-ruby 0.636585395 built-ruby 0.957402811 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 2.668524054 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 3.179867816 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 0.95098083 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.566350784 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.864899405 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.357870921 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.865036693 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.780426887 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 2.162654032 ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] 1.560896831 name ruby 2.0.0p598 (2014-11-13) [x86_64-linux] built-ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] require_thread 1.121 0.637 0.951 Speedup ratio: compare with the result of `ruby 2.0.0p598 (2014-11-13) [x86_64-linux]' (greater is better) name built-ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] require_thread 1.761 1.179 ただし、中田さんが指摘している 2.2.2とくらべてtrunkが10倍以上遅い現象は、こちらでは一度も再現できていないことは付記しておきます。 ---------------------------------------- Bug #11559: ビジーループの thread と YAML.parse を組み合わせたときの実行時間が 2.2.3 で遅くなっている https://bugs.ruby-lang.org/issues/11559#change-54468 * Author: 三村 益隆 * Status: Closed * 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/