Issue #17209 has been reported by bruno.escherl / xing.com (Bruno Escherl).

----------------------------------------
Bug #17209: String#slice allocates Range object in ruby 3.0.0preview1
https://bugs.ruby-lang.org/issues/17209

* Author: bruno.escherl / xing.com (Bruno Escherl)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.0.0preview1 (2020-09-25 master 0096d2b895) [x86_64-darwin19]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
While trying to optimise a use case, where I need to get parts of a string extracted, ignoring a constant length prefix, I noticed that ruby 3.0.0preview1 allocates an additional Range object for String#slice, that ruby 2.7.1 didn't allocate.

Test script using memory_profiler gem:

``` ruby
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'memory_profiler'
end

string = 'const:prefix:and:the:rest'

MemoryProfiler.report do
  10000.times do
    string.slice(13..-1)
  end
end.pretty_print

```

Output for ruby 3.0.0preview1
```
Total allocated: 800000 bytes (20000 objects)
Total retained:  0 bytes (0 objects)

allocated memory by gem
-----------------------------------
    800000  other

allocated memory by file
-----------------------------------
    800000  profile_string_slice.rb

allocated memory by location
-----------------------------------
    800000  profile_string_slice.rb:12

allocated memory by class
-----------------------------------
    400000  Range
    400000  String

allocated objects by gem
-----------------------------------
     20000  other

allocated objects by file
-----------------------------------
     20000  profile_string_slice.rb

allocated objects by location
-----------------------------------
     20000  profile_string_slice.rb:12

allocated objects by class
-----------------------------------
     10000  Range
     10000  String
```

Output for ruby 2.7.1
```
Total allocated: 400000 bytes (10000 objects)
Total retained:  0 bytes (0 objects)

allocated memory by gem
-----------------------------------
    400000  other

allocated memory by file
-----------------------------------
    400000  profile_string_slice.rb

allocated memory by location
-----------------------------------
    400000  profile_string_slice.rb:12

allocated memory by class
-----------------------------------
    400000  String

allocated objects by gem
-----------------------------------
     10000  other

allocated objects by file
-----------------------------------
     10000  profile_string_slice.rb

allocated objects by location
-----------------------------------
     10000  profile_string_slice.rb:12

allocated objects by class
-----------------------------------
     10000  String
```

Is this a regression in ruby 3 or something that memory_profiler doesn't record correctly in 2.7?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>