[PATCH] openssl: reduce memory allocation in OpenSSL::Buffering#do_write
When writing data to an SSLSocket, there are a lot of, in my opinion, unnecessary strings being allocated, concretely in OpenSSL::Buffering#do_write.
When the buffer would be written, it would always be copied into a new string first, regardless of whether the write was partial or not. And in case of partial writes, it's not necessary to create copies of remaining data, we could just use the
String[from, length] = "" trick immediately which modifies the string in-place.
I also thought that splitting writes on newlines was adding unnecessary memory allocations, so I removed that.
I tested uploading a 5MB file using HTTP.rb, and memory allocation went from 7.7 MB to 0.2 MB with this change.
require "http" require "memory_profiler" require "stringio" body = StringIO.new("a" * 5*1024*1024) MemoryProfiler.report do HTTP.post("https://example.com", body: body) end.pretty_print
#1 [ruby-core:85315] Updated by normalperson (Eric Wong) 4 months ago
I also thought that splitting writes on newlines was adding
unnecessary memory allocations, so I removed that.
I tested uploading a 5MB file using HTTP.rb, and memory
allocation went from 7.7 MB to 0.2 MB with this change.
Nice! This patch looks good to me, thanks.
#3 Updated by janko (Janko Marohnić) about 1 month ago
Any updates on this one? I think it would be nice to have this included in the next patch version. This will make memory usage during large file uploads consistent regardless of whether it's going to HTTP or HTTPS endpoint; currently uploads over HTTPS consume a lot more memory, while HTTP uploads don't really allocate extra memory.