Last active
January 25, 2023 11:55
-
-
Save argami/8081bc97bb56a60da2e755dc157776c5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
source "https://rubygems.org" | |
gem "benchmark-ips" | |
gem "ruby-progressbar" | |
gem "benchmark-memory" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
require "bundler" | |
Bundler.require | |
require "ostruct" | |
data = { x: 100, y: 200, z: "some other data", a: "more text data", b: 1100.00, c: Time.now } | |
PointStruct = Struct.new(:x, :y, :z, :a, :b, :c) | |
class PointClass | |
attr_accessor :x, :y, :z, :a, :b, :c | |
def initialize(args) | |
@x = args.fetch(:x) | |
@y = args.fetch(:y) | |
@z = args.fetch(:z) | |
@a = args.fetch(:a) | |
@b = args.fetch(:b) | |
@c = args.fetch(:c) | |
end | |
end | |
puts "\n\nINITIALIZATION ==========" | |
Benchmark.ips do |x| | |
x.report("OpenStruct") { OpenStruct.new(data) } | |
x.report("Struct") { PointStruct.new(data) } | |
x.report("Class") { PointClass.new(data) } | |
x.report("Hash") { {}.merge(data) } | |
x.compare! | |
end | |
puts "\n\nREAD ==========" | |
point_struct = PointStruct.new(data) | |
point_class = PointClass.new(data) | |
point_hash = {}.merge(data) | |
point_open_struct = OpenStruct.new(data) | |
Benchmark.ips do |x| | |
x.config(warmup: 90) if RUBY_ENGINE == "jruby" | |
x.report("OpenStruct") { point_open_struct.z } | |
x.report("Struct") { point_struct.z } | |
x.report("Class") { point_class.z } | |
x.report("Hash") { point_hash.fetch(:z) } | |
x.compare! | |
end | |
puts "\n\nWRITE ==========" | |
Benchmark.ips do |x| | |
x.report("OpenStruct") do | |
point_open_struct.x = "even more data" | |
point_open_struct.z = 1000.00 | |
point_open_struct.b = 100 | |
end | |
x.report("Struct") do | |
point_struct.x = "even more data" | |
point_struct.z = 1000.00 | |
point_struct.b = 100 | |
end | |
x.report("Class") do | |
point_class.x = "even more data" | |
point_class.z = 1000.00 | |
point_class.b = 100 | |
end | |
x.report("Hash") do | |
point_hash[:x] = "even more data" | |
point_hash[:z] = 1000.00 | |
point_hash[:b] = 100 | |
end | |
x.compare! | |
end | |
puts "\n\n############# MEMORY ==========" | |
puts "\n\nINITIALIZATION ==========" | |
Benchmark.memory do |x| | |
x.report("OpenStruct") { OpenStruct.new(data) } | |
x.report("Struct") { PointStruct.new(data) } | |
x.report("Class") { PointClass.new(data) } | |
x.report("Hash") { {}.merge(data) } | |
x.compare! | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
INITIALIZATION ========== | |
Warming up -------------------------------------- | |
OpenStruct 7.763k i/100ms | |
Struct 765.889k i/100ms | |
Class 296.770k i/100ms | |
Hash 451.498k i/100ms | |
Calculating ------------------------------------- | |
OpenStruct 77.672k (± 2.7%) i/s - 388.150k in 5.001142s | |
Struct 7.618M (± 1.4%) i/s - 38.294M in 5.027768s | |
Class 2.787M (±11.1%) i/s - 13.948M in 5.100858s | |
Hash 4.338M (± 9.1%) i/s - 21.672M in 5.055607s | |
Comparison: | |
Struct: 7618131.0 i/s | |
Hash: 4337601.8 i/s - 1.76x (± 0.00) slower | |
Class: 2786751.9 i/s - 2.73x (± 0.00) slower | |
OpenStruct: 77672.0 i/s - 98.08x (± 0.00) slower | |
READ ========== | |
Warming up -------------------------------------- | |
OpenStruct 1.189M i/100ms | |
Struct 1.927M i/100ms | |
Class 1.978M i/100ms | |
Hash 769.667k i/100ms | |
Calculating ------------------------------------- | |
OpenStruct 11.407M (± 7.5%) i/s - 57.058M in 5.037030s | |
Struct 18.108M (± 9.9%) i/s - 90.582M in 5.079644s | |
Class 19.829M (± 2.2%) i/s - 100.895M in 5.090690s | |
Hash 13.089M (± 2.1%) i/s - 65.422M in 5.000433s | |
Comparison: | |
Class: 19828999.2 i/s | |
Struct: 18107923.1 i/s - same-ish: difference falls within error | |
Hash: 13089378.4 i/s - 1.51x (± 0.00) slower | |
OpenStruct: 11406605.9 i/s - 1.74x (± 0.00) slower | |
WRITE ========== | |
Warming up -------------------------------------- | |
OpenStruct 414.666k i/100ms | |
Struct 1.347M i/100ms | |
Class 1.254M i/100ms | |
Hash 800.079k i/100ms | |
Calculating ------------------------------------- | |
OpenStruct 4.136M (± 0.5%) i/s - 20.733M in 5.013139s | |
Struct 13.239M (± 3.5%) i/s - 67.370M in 5.095966s | |
Class 12.363M (±14.1%) i/s - 60.171M in 5.051611s | |
Hash 7.970M (± 5.6%) i/s - 40.004M in 5.039890s | |
Comparison: | |
Struct: 13238563.6 i/s | |
Class: 12362712.8 i/s - same-ish: difference falls within error | |
Hash: 7969707.0 i/s - 1.66x (± 0.00) slower | |
OpenStruct: 4135881.8 i/s - 3.20x (± 0.00) slower | |
############# MEMORY ========== | |
INITIALIZATION ========== | |
Calculating ------------------------------------- | |
OpenStruct 4.384k memsize ( 0.000 retained) | |
45.000 objects ( 0.000 retained) | |
6.000 strings ( 0.000 retained) | |
Struct 88.000 memsize ( 0.000 retained) | |
1.000 objects ( 0.000 retained) | |
0.000 strings ( 0.000 retained) | |
Class 88.000 memsize ( 0.000 retained) | |
1.000 objects ( 0.000 retained) | |
0.000 strings ( 0.000 retained) | |
Hash 208.000 memsize ( 0.000 retained) | |
2.000 objects ( 0.000 retained) | |
0.000 strings ( 0.000 retained) | |
Comparison: | |
Struct: 88 allocated | |
Class: 88 allocated - same | |
Hash: 208 allocated - 2.36x more | |
OpenStruct: 4384 allocated - 49.82x more |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment