ruby-changes:49568
From: normal <ko1@a...>
Date: Mon, 8 Jan 2018 19:23:33 +0900 (JST)
Subject: [ruby-changes:49568] normal:r61684 (trunk): net/http: clear compressed chunk after decompression
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 Index: lib/net/http/response.rb =================================================================== --- lib/net/http/response.rb (revision 61683) +++ lib/net/http/response.rb (revision 61684) @@ -380,6 +380,7 @@ class Net::HTTPResponse https://github.com/ruby/ruby/blob/trunk/lib/net/http/response.rb#L380 end block = proc do |compressed_chunk| @inflate.inflate(compressed_chunk) do |chunk| + compressed_chunk.clear dest << chunk end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/