Project

General

Profile

Actions

Bug #19424

closed

Significant performance decreases in `OpenStruct#marshal_load` in Ruby 3.0 and 3.1

Added by sumitdey035 (Sumit Dey) about 1 year ago. Updated about 1 year ago.

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

Description

I can see degradation in Marshal load only in Ruby 3.1.2 compared to 2.7.4
Processing time increased by 200%(2.4 sec to 4.3 sec)
Memory allocation increased by 600%(6500001 to 39000004)

require 'benchmark'
require 'ostruct'

N_OJ = 500_000

ex_HASH = { 'one' => 1, 'array' => [ true, false ] }
ex_JSON = '{ "one": 1, "array": [ true, false ] }'

ex_STRUCT = OpenStruct.new( one: 1, hash: ex_HASH, array: [ true, false ] )
ex_MARSHAL = "\x04\bU:\x0FOpenStruct{\b:\bonei\x06:\thash{\aI\"\bone\x06:\x06ETi\x06I\"\narray\x06;\bT[\aTF:\narray[\aTF"

"-----------------Ruby #{system("rbenv version")}----------------"

Benchmark.bm(20) do |x|
  x.report('native marshal dump') do
    N_OJ.times do
      y = Marshal.dump(ex_STRUCT)
    end
  end

  x.report('native marshal load') do
    N_OJ.times do
      y = Marshal.load(ex_MARSHAL)
    end
  end

  start_memory = GC.stat[:total_allocated_objects]
  N_OJ.times do
    y = Marshal.dump(ex_STRUCT)
  end
  end_memory = GC.stat[:total_allocated_objects]
  print "Marshal dump memory allocation- #{end_memory - start_memory}\n"

  start_memory = GC.stat[:total_allocated_objects]
  N_OJ.times do
    y = Marshal.load(ex_MARSHAL)
  end
  end_memory = GC.stat[:total_allocated_objects]
  print "Marshal load memory allocation- #{end_memory - start_memory}\n"
end```

**Benchmark and Memory consumption result**
![](Screenshot 2023-02-07 at 1.04.49 PM.png)

Files

Screenshot 2023-02-07 at 1.04.49 PM.png (184 KB) Screenshot 2023-02-07 at 1.04.49 PM.png sumitdey035 (Sumit Dey), 02/08/2023 08:59 AM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0