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/