Project

General

Profile

Actions

Feature #14410

closed

Reduce allocations and retained objects in the uri common module

Added by sam.saffron (Sam Saffron) about 6 years ago. Updated about 6 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:85153]

Description

Patch at:

https://github.com/ruby/ruby/pull/1801

require 'memory_profiler'

MemoryProfiler.report do
require 'uri'
end.pretty_print

Before:

Total allocated: 986643 bytes (15159 objects)
Total retained: 246370 bytes (2532 objects)

After:

Total allocated: 926903 bytes (13665 objects)
Total retained: 208570 bytes (1587 objects)


Quite a significant change, almost 1000 less RVALUEs around when you require 'uri' which almost every web app does.

See also: https://ruby-talk.trydiscourse.com/t/psa-string-memory-use-reduction-techniques/74477/13?u=samsaffron

To explain [-i.chr]


Files

diff.txt (1.49 KB) diff.txt sam.saffron (Sam Saffron), 01/27/2018 08:27 AM
Actions #1

Updated by sam.saffron (Sam Saffron) about 6 years ago

  • File deleted (diff.txt)

Updated by normalperson (Eric Wong) about 6 years ago

wrote:

https://bugs.ruby-lang.org/issues/14410
https://github.com/ruby/ruby/pull/1801
diff.txt (1.03 KB)

Careful with "frozen_string_literal: true".

Even with tired eyes I see self.decode_www_form uses literals
which get modified, and maybe other places.

Did you try "make test-all"?

Updated by sam.saffron (Sam Saffron) about 6 years ago

Yes, tests appear to be passing.

I went with the atomic version here cause there is a giant string Hash and it is way cleaner to apply it to the entire file then work through every string in the Hash

Actions #5

Updated by Anonymous about 6 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r62081.


uri/common: reduce allocations and retained objects

Thanks to Sam Saffron for this patch, it shows
a nice reduction which affects many web applications:

require 'memory_profiler'

MemoryProfiler.report do
require 'uri'
end.pretty_print

Before:

Total allocated: 986643 bytes (15159 objects)
Total retained: 246370 bytes (2532 objects)

After:

Total allocated: 926903 bytes (13665 objects)
Total retained: 208570 bytes (1587 objects)

Updated by normalperson (Eric Wong) about 6 years ago

wrote:

I went with the atomic version here cause there is a giant string Hash and it is way cleaner to apply it to the entire file then work through every string in the Hash

Thanks, I looked over it again and committed as r62081

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0