Skip to content
  • Eric Wong's avatar
    cee7f691
    io.c: avoid kwarg parsing in C API · cee7f691
    Eric Wong authored
    * 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
    cee7f691
    io.c: avoid kwarg parsing in C API
    Eric Wong authored
    * 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
Loading