Skip to content
  • Aaron Patterson's avatar
    d3574c11
    Move IO#readline to Ruby · d3574c11
    Aaron Patterson authored
    This commit moves IO#readline to Ruby.  In order to call C functions,
    keyword arguments must be converted to hashes.  Prior to this commit,
    code like `io.readline(chomp: true)` would allocate a hash.  This
    commits moves the keyword "denaturing" to Ruby, allowing us to send
    positional arguments to the C API and avoiding the hash allocation.
    
    Here is an allocation benchmark for the method:
    
    ```
    x = GC.stat(:total_allocated_objects)
    File.open("/usr/share/dict/words") do |f|
      f.readline(chomp: true) until f.eof?
    end
    p ALLOCATIONS: GC.stat(:total_allocated_objects) - x
    ```
    
    Before this commit, the output was this:
    
    ```
    $ make run
    ./miniruby -I./lib -I. -I.ext/common  -r./arm64-darwin22-fake  ./test.rb
    {:ALLOCATIONS=>707939}
    ```
    
    Now it is this:
    
    ```
    $ make run
    ./miniruby -I./lib -I. -I.ext/common  -r./arm64-darwin22-fake  ./test.rb
    {:ALLOCATIONS=>471962}
    ```
    
    [Bug #19890] [ruby-core:114803]
    d3574c11
    Move IO#readline to Ruby
    Aaron Patterson authored
    This commit moves IO#readline to Ruby.  In order to call C functions,
    keyword arguments must be converted to hashes.  Prior to this commit,
    code like `io.readline(chomp: true)` would allocate a hash.  This
    commits moves the keyword "denaturing" to Ruby, allowing us to send
    positional arguments to the C API and avoiding the hash allocation.
    
    Here is an allocation benchmark for the method:
    
    ```
    x = GC.stat(:total_allocated_objects)
    File.open("/usr/share/dict/words") do |f|
      f.readline(chomp: true) until f.eof?
    end
    p ALLOCATIONS: GC.stat(:total_allocated_objects) - x
    ```
    
    Before this commit, the output was this:
    
    ```
    $ make run
    ./miniruby -I./lib -I. -I.ext/common  -r./arm64-darwin22-fake  ./test.rb
    {:ALLOCATIONS=>707939}
    ```
    
    Now it is this:
    
    ```
    $ make run
    ./miniruby -I./lib -I. -I.ext/common  -r./arm64-darwin22-fake  ./test.rb
    {:ALLOCATIONS=>471962}
    ```
    
    [Bug #19890] [ruby-core:114803]
Loading