mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
cee7f6911b
* benchmark/bm_io_nonblock_noex2.rb: new benchmark based on bm_io_nonblock_noex.rb * io.c (io_read_nonblock): move documentation to prelude.rb (io_write_nonblock): ditto (Init_io): private, internal methods for prelude.rb use only * prelude.rb (IO#read_nonblock): wrapper + documentation (IO#write_nonblock): ditto [ruby-core:71439] [Feature #11339] rb_scan_args and hash lookups for kwargs in the C API are clumsy and slow. Instead of improving the C API for performance, use Ruby instead :) Implement IO#read_nonblock and IO#write_nonblock in prelude.rb to avoid argument parsing via rb_scan_args and hash lookups. This speeds up IO#write_nonblock and IO#read_nonblock benchmarks in both cases, including the original non-idiomatic case where the `exception: false' hash is pre-allocated to avoid GC pressure. Now, writing the kwargs in natural, idiomatic Ruby is fastest. I've added the noex2 benchmark to show this. 2015-11-12 01:41:12 +0000 target 0: a (ruby 2.3.0dev (2015-11-11 trunk 52540) [x86_64-linux]) target 1: b (ruby 2.3.0dev (2015-11-11 avoid-kwarg-capi 52540) ----------------------------------------------------------- benchmark results: minimum results in each 10 measurements. Execution time (sec) name a b io_nonblock_noex 2.508 2.382 io_nonblock_noex2 2.950 1.882 Speedup ratio: compare with the result of `a' (greater is better) name b io_nonblock_noex 1.053 io_nonblock_noex2 1.567 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
21 lines
337 B
Ruby
21 lines
337 B
Ruby
nr = 1_000_000
|
|
i = 0
|
|
msg = '.'
|
|
buf = '.'
|
|
begin
|
|
r, w = IO.pipe
|
|
while i < nr
|
|
i += 1
|
|
w.write_nonblock(msg, exception: false)
|
|
r.read_nonblock(1, buf, exception: false)
|
|
end
|
|
rescue ArgumentError # old Rubies
|
|
while i < nr
|
|
i += 1
|
|
w.write_nonblock(msg)
|
|
r.read_nonblock(1, buf)
|
|
end
|
|
ensure
|
|
r.close
|
|
w.close
|
|
end
|