[ruby-cvs:68783] normal:r61602 (trunk): net/protocol: optimize large read case

normal at ruby-lang.org normal at ruby-lang.org
Fri Jan 5 11:22:23 JST 2018


normal	2018-01-05 11:22:23 +0900 (Fri, 05 Jan 2018)

  New Revision: 61602

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61602

  Log:
    net/protocol: optimize large read case
    
    There are several places where rbuf_consume is called with
    @rbuf.size as its length arg; simplify that case by avoiding
    the slow String#slice! operation in favor of a lightweight
    replacement.
    
    The following script exhibits reduced memory usage and
    runtimes using the time(1) command:
    
    2.9s =>  2.6s
    70MB => 12 MB
    
    ---------
    require 'net/http'
    require 'digest/md5'
    Thread.abort_on_exception = true
    s = TCPServer.new('127.0.0.1', 0)
    len = 1024 * 1024 * 1024
    th = Thread.new do
      c = s.accept
      c.readpartial(16384)
      c.write("HTTP/1.0 200 OK\r\nContent-Length: #{len}\r\n\r\n")
      IO.copy_stream('/dev/zero', c, len)
      c.close
    end
    
    addr = s.addr
    Net::HTTP.start(addr[3], addr[1]) do |http|
      http.request_get('/') do |res|
        dig = Digest::MD5.new
        res.read_body { |buf|
          dig.update(buf)
          # String#clear is important to reduce malloc overhead,
          # but most Ruby programmers don't do this :<
          buf.clear
        }
        puts dig.hexdigest
      end
    end
    ----------
    
    * lib/net/protocol (rbuf_consume): optimize for @rbuf.size == len
      [Feature #14268]

  Modified files:
    trunk/lib/net/protocol.rb


More information about the ruby-cvs mailing list