[ruby-cvs:68865] normal:r61684 (trunk): net/http: clear compressed chunk after decompression

normal at ruby-lang.org normal at ruby-lang.org
Mon Jan 8 19:23:27 JST 2018


normal	2018-01-08 19:23:27 +0900 (Mon, 08 Jan 2018)

  New Revision: 61684

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

  Log:
    net/http: clear compressed chunk after decompression
    
    We no longer need the compressed data once the inflate block is
    called; so clear it ASAP to reduce memory overhead.  This is a
    small chunk, so it only saves a few hundred kilobytes with the
    script below.
    
    before:        RssAnon:     5976 kB
     after:        RssAnon:     5564 kB
    ------
    require 'net/http'
    require 'zlib'
    response_gz = ARGV.shift or abort "#$0 TEMPORARY_FILE"
    
     # pre-create response since compressing is slower than decompressing
    unless File.readable?(response_gz)
      nr = 16384 * 2
      buf = ((0..255).map(&:chr).join * 128)
      File.open(response_gz, 'wb') do |fp|
        gzip = Zlib::GzipWriter.new(fp)
        nr.times { gzip.write(buf) }
        gzip.close
      end
      buf.clear
    end
    response_gz = File.open(response_gz)
    
    s = TCPServer.new('127.0.0.1', 0)
    pid = fork do
      c = s.accept
      c.readpartial(16384).clear
      c.write("HTTP/1.1 200 OK\r\n" \
              "Content-Length: #{response_gz.stat.size}\r\n" \
              "Content-Encoding: gzip\r\n" \
              "Accept-Ranges: bytes\r\n" \
              "\r\n")
      IO.copy_stream(response_gz, c)
      c.close
    end
    
    addr = s.addr
    Net::HTTP.start(addr[3], addr[1]) do |http|
      http.request_get(-'/') do |res|
        res.read_body(&:clear)
      end
    end
    puts File.readlines(-'/proc/self/status').grep(/RssAnon/)[0]
    Process.waitpid2(pid)
    ------
    * lib/net/http/response.rb (inflate_adapter): clear compressed_chunk

  Modified files:
    trunk/lib/net/http/response.rb


More information about the ruby-cvs mailing list