Skip to content

Instantly share code, notes, and snippets.

@marcomd
Created November 27, 2024 17:24
Show Gist options
  • Save marcomd/aa985067bc1c76a59f3cbf3dfe7658b2 to your computer and use it in GitHub Desktop.
Save marcomd/aa985067bc1c76a59f3cbf3dfe7658b2 to your computer and use it in GitHub Desktop.
Benchmark the new Ruby shape introduced in ruby 3.2
class TestObjectShapeGetCheck
def initialize
@var0 = 0
@var1 = 1
@var2 = 2
@var3 = 3
@var4 = 4
@var5 = 5
@var6 = 6
@var7 = 7
@var8 = 8
@var9 = 9
@var10 = 10
@var11 = 11
@var12 = 12
@var13 = 13
@var14 = 14
@var15 = 15
@var16 = 16
@var17 = 17
@var18 = 18
@var19 = 19
@var20 = 20
@var21 = 21
@var22 = 22
@var23 = 23
@var24 = 24
@var25 = 25
@var26 = 26
@var27 = 27
@var28 = 28
@var29 = 29
@var30 = 30
@var31 = 31
@var32 = 32
@var33 = 33
@var34 = 34
@var35 = 35
@var36 = 36
@var37 = 37
@var38 = 38
@var39 = 39
@var40 = 40
@var41 = 41
@var42 = 42
@var43 = 43
@var44 = 44
@var45 = 45
@var46 = 46
@var47 = 47
@var48 = 48
@var49 = 49
@var50 = 50
@var51 = 51
@var52 = 52
@var53 = 53
@var54 = 54
@var55 = 55
@var56 = 56
@var57 = 57
@var58 = 58
@var59 = 59
@var60 = 60
@var61 = 61
@var62 = 62
@var63 = 63
@var64 = 64
@var65 = 65
@var66 = 66
@var67 = 67
@var68 = 68
@var69 = 69
@var70 = 70
@var71 = 71
@var72 = 72
@var73 = 73
@var74 = 74
@var75 = 75
@var76 = 76
@var77 = 77
@var78 = 78
@var79 = 79
@var80 = 80
@var81 = 81
@var82 = 82
@var83 = 83
@var84 = 84
@var85 = 85
@var86 = 86
@var87 = 87
@var88 = 88
@var89 = 89
@var90 = 90
@var91 = 91
@var92 = 92
@var93 = 93
@var94 = 94
@var95 = 95
@var96 = 96
@var97 = 97
@var98 = 98
@var99 = 99
end
def test
# Check the access and the cache performance
100.times do
100.times.sum { |i| instance_variable_get("@var#{i}") }
end
end
end
class TestObjectShapeWriteCheck
def initialize(number)
@number = number
# Set lots of instance variables to check the performance
number.times {|i| instance_variable_set("@var#{i}", 1) }
end
def test
@number.times.sum { |i| instance_variable_get("@var#{i}") }
end
end
require 'benchmark'
puts "Benchmark Object Shape - Ruby version: #{RUBY_VERSION}"
Benchmark.bm do |x|
x.report("Test Get") do
100.times { TestObjectShapeGetCheck.new.test }
end
x.report("Test Write") do
100.times { TestObjectShapeWriteCheck.new(10_000).test }
end
end
@marcomd
Copy link
Author

marcomd commented Nov 27, 2024

Interpreters compiled on an arm64-darwin23 system

Ruby 2.6

Benchmark Object Shape - Ruby version: 2.6.10
       user     system      total        real
Test Get  0.172598   0.001317   0.173915 (  0.173993)
Test Write  0.316040   0.002060   0.318100 (  0.318193)

Ruby 2.7

Benchmark Object Shape - Ruby version: 2.7.8
       user     system      total        real
Test Get  0.149773   0.000508   0.150281 (  0.150283)
Test Write  0.297791   0.002364   0.300155 (  0.300467)

Ruby 3.0

Benchmark Object Shape - Ruby version: 3.0.4
       user     system      total        real
Test Get  0.159921   0.000519   0.160440 (  0.160455)
Test Write  0.313218   0.002063   0.315281 (  0.315355)

Ruby 3.1

Benchmark Object Shape - Ruby version: 3.1.4
       user     system      total        real
Test Get  0.155305   0.000858   0.156163 (  0.156332)
Test Write  0.306863   0.003154   0.310017 (  0.310303)

Ruby 3.2

Benchmark Object Shape - Ruby version: 3.2.5
       user     system      total        real
Test Get  0.246723   0.000768   0.247491 (  0.247523)
Test Write 19.333101   0.056330  19.389431 ( 19.426760)

^ 19.333101

Ruby 3.3

Benchmark Object Shape - Ruby version: 3.3.6
       user     system      total        real
Test Get  0.205304   0.000885   0.206189 (  0.206241)
Test Write 13.159885   0.036833  13.196718 ( 13.213467)

^ 13.159885

Ruby 3.4.0dev (2024-11-27T17:12:23Z master 0af2eafc59) +PRISM

Benchmark Object Shape - Ruby version: 3.4.0
                user     system      total        real
Test Get    0.218310   0.001404   0.219714 (  0.220102)
Test Write  0.452340   0.004006   0.456346 (  0.456629)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment