ruby-changes:49548
From: normal <ko1@a...>
Date: Mon, 8 Jan 2018 10:11:38 +0900 (JST)
Subject: [ruby-changes:49548] normal:r61664 (trunk): open-uri: clear string after buffering
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 Index: lib/open-uri.rb =================================================================== --- lib/open-uri.rb (revision 61663) +++ lib/open-uri.rb (revision 61664) @@ -354,6 +354,7 @@ module OpenURI https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb#L354 if options[:progress_proc] && Net::HTTPSuccess === resp options[:progress_proc].call(buf.size) end + str.clear } } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/