[ruby-cvs:68845] normal:r61664 (trunk): open-uri: clear string after buffering

normal at ruby-lang.org normal at ruby-lang.org
Mon Jan 8 10:11:33 JST 2018


normal	2018-01-08 10:11:33 +0900 (Mon, 08 Jan 2018)

  New Revision: 61664

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

  Log:
    open-uri: clear string after buffering
    
    Since r58846 (in Ruby 2.5), it is safe to clear the string
    yielded to Net::HTTPResponse#read_body methods.  This
    reduces malloc garbage (anonymous RSS) using the Linux-only
    script below:
    
    before:  user     system      total        real
          0.030000   0.250000   0.280000 (  0.280511)
        RssAnon:	   60240 kB
    
     after:  user     system      total        real
          0.050000   0.223333   0.273333 (  0.273118)
        RssAnon:	    6676 kB
    
    ------
      # warning this script requires 1G free space for buffering
    require 'open-uri'
    require 'socket'
    require 'benchmark'
    
    s = TCPServer.new('127.0.0.1', 0)
    len = 1024 * 1024 * 1024
    buf = ((0..255).map(&:chr).join * 128)
    nr = len / buf.size
    pid = fork do
      c = s.accept
      c.readpartial(16384).clear
      c.write("HTTP/1.1 200 OK\r\n" \
      "Content-Length: #{len}\r\n" \
              "Content-Type: application/octet-stream\r\n" \
              "\r\n")
      buf.freeze # speeds up IO#write slightly
      nr.times { c.write(buf) }
      c.close
    end
    
    addr = s.addr
    open("http://#{addr[3]}:#{addr[1]}/", "rb") do |fp|
      bm = Benchmark.measure do
        while fp.read(16384, buf)
        end
      end
      puts bm
    end
    puts File.readlines("/proc/#$$/status").grep(/RssAnon/)[0]
    Process.waitpid2(pid)
    ------
    
    * lib/open-uri.rb: clear string yielded by Net::HTTPResponse#read_body
      [ruby-core:84662] [Feature #14320]

  Modified files:
    trunk/lib/open-uri.rb


More information about the ruby-cvs mailing list