Feature #16255
closedMake `monitor.rb` built-in
Description
Abstract¶
monitor.rb
introduces MonitorMixin
module and Monitor
class.
Now, rubygems.rb
requires monitor.rb
so that most of Ruby applications (*1) requires monitor.rb
[*1] running MRI with --disable-gems
can eliminate monitor.rb
, but only a few people use this option.
Also recent changes (6ec1720aa38772ba4b7515790443cb578340518b and so on) to make it atomic introduces several overhead.
Making them in C will avoid such overhead.
Naruse-san made monitor-ext gem to make it faster by making C-extension.
This proposal is to make it built-in class.
Approach¶
Implement Monitor
class as re-entrant mutex object in C and implement MonitorMixin
with it.
Now, Monitor
class is implemented with MonitorMixin
, but it is easy to implement Monitor
class directly and faster in C.
MonitorMixin
and MonitorMixin::ConditionalVariable
are remained in lib/monitor.rb
, because it is easy to write :p
Implementation¶
https://github.com/ruby/ruby/compare/master...ko1:thread_monitor
Evaluation¶
require_relative 'benchmark/lib/load'
Benchmark.driver(repeat_count: 1){|x|
x.executable name: '2.5.2', command: %w'/home/ko1/ruby/install/ruby_2_5/bin/ruby'
x.executable name: '2.6.6', command: %w'/home/ko1/ruby/install/ruby_2_6/bin/ruby'
x.executable name: 'trunk', command: %w'/home/ko1/ruby/install/trunk/bin/ruby'
x.prelude %{
mon = Monitor.new
}
x.report %{
mon.synchronize{
mon.synchronize{
}
}
}
}
#=>
# trunk: 4345545.8 i/s
# 2.5.2: 1657762.1 i/s - 2.62x slower
# 2.6.6: 499165.7 i/s - 8.71x slower
Discussion¶
Queue
, Mutex
are the alias of Thread::Queue
, Thread::Mutex
.
p Queue #=> Thread::Queue
I defined Thread::Monitor
and make alias by Monitor = Thread::Monitor
. Is it okay?
I removed mon_
prefix methods from Monitor
class. I believe they are only for MonitorMixin
.
... but I found two examples which call mon_ prefix methods for Monitor
class:
/home/gem-codesearch/gem-codesearch/latest-gem/gel-0.3.0/lib/gel/db.rb: @monitor.mon_owned?
/home/gem-codesearch/gem-codesearch/latest-gem/keepyourhead-0.2.2/lib/Keepyourhead/Cache.rb: @monitor.mon_synchronize {
Should we obsolete them for Monitor
class?