mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* 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
 |