Skip to content

Instantly share code, notes, and snippets.

@fnordfish
Last active March 29, 2023 14:29
Show Gist options
  • Save fnordfish/4b22aed6281800897e56399d6c53c0be to your computer and use it in GitHub Desktop.
Save fnordfish/4b22aed6281800897e56399d6c53c0be to your computer and use it in GitHub Desktop.
require "bundler/inline"
gemfile do
# eval_gemfile(File.expand_path("../Gemfile", __dir__))
gem "psych", git: "https://github.com/fnordfish/psych.git", branch: "dump-stringify-names"
gem "benchmark-ips"
gem "benchmark-memory"
gem "activesupport"
gem "dry-transformer"
end
require "benchmark/memory"
require "active_support/core_ext/hash"
require "dry/transformer/hash_transformations"
DATA = [
{
created_at: "Thu Jun 22 21:00:00 +0000 2017",
id: 877994604561387500,
id_str: "877994604561387520",
text: "Creating a Grocery List Manager Using Angular, Part 1: Add & Display Items https://t.co/xFox78juL1 #Angular",
truncated: false,
entities: {
hashtags: [{text: "Angular", indices: [103, 111]}],
symbols: [],
user_mentions: [],
urls: [
{
url: "https://t.co/xFox78juL1",
expanded_url: "http://buff.ly/2sr60pf",
display_url: "buff.ly/2sr60pf",
indices: [79, 102]
}
]
},
source: "<a href=\"http://bufferapp.com\" rel=\"nofollow\">Buffer</a>",
user: {
id: 772682964,
id_str: "772682964",
name: "SitePoint JavaScript",
screen_name: "SitePointJS",
location: "Melbourne, Australia",
description: "Keep up with JavaScript tutorials, tips, tricks and articles at SitePoint.",
url: "http://t.co/cCH13gqeUK",
entities: {
url: {
urls: [
{
url: "http://t.co/cCH13gqeUK",
expanded_url: "https://www.sitepoint.com/javascript",
display_url: "sitepoint.com/javascript",
indices: [0, 22]
}
]
},
description: {urls: []}
},
protected: false,
followers_count: 2145,
friends_count: 18,
listed_count: 328,
created_at: "Wed Aug 22 02:06:33 +0000 2012",
favourites_count: 57,
utc_offset: 43200,
time_zone: "Wellington"
}
}
]
DryDeepStringifyKeys = Dry::Transformer::HashTransformations[:deep_stringify_keys]
def dump_stringify_names
Psych.safe_dump(DATA, stringify_names: true)
end
def dump_symbol_names
Psych.safe_dump(DATA, permitted_classes: [Symbol])
end
def as_dump_deep_transform_keys
data = DATA.map { |h| h.deep_transform_keys(&:to_s) }
Psych.safe_dump(data)
end
def dry_dump_deep_transform_keys
data = DATA.map { |h| DryDeepStringifyKeys.call(h) }
Psych.safe_dump(data)
end
Benchmark.ips do |x|
x.report("IPS: dump_stringify_names") { dump_stringify_names }
x.report("IPS: dump_symbol_names") { dump_symbol_names }
x.report("IPS: as_dump_deep_transform_keys") { as_dump_deep_transform_keys }
x.report("IPS: dry_dump_deep_transform_keys") { dry_dump_deep_transform_keys }
x.compare!
end
Benchmark.memory do |x|
x.report("MEM: dump_stringify_names") { dump_stringify_names }
x.report("MEM: dump_symbol_names") { dump_symbol_names }
x.report("MEM: as_dump_deep_transform_keys") { as_dump_deep_transform_keys }
x.report("MEM: dry_dump_deep_transform_keys") { dry_dump_deep_transform_keys }
x.compare!
end
bundle exec ruby -v ./benchmark_dump.rb
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-darwin22]
Warming up --------------------------------------
IPS: dump_stringify_names
259.000 i/100ms
IPS: dump_symbol_names
308.000 i/100ms
IPS: as_dump_deep_transform_keys
239.000 i/100ms
IPS: dry_dump_deep_transform_keys
249.000 i/100ms
Calculating -------------------------------------
IPS: dump_stringify_names
2.390k (±10.8%) i/s - 11.914k in 5.059538s
IPS: dump_symbol_names
3.025k (± 5.6%) i/s - 15.092k in 5.005031s
IPS: as_dump_deep_transform_keys
2.404k (± 3.8%) i/s - 12.189k in 5.078703s
IPS: dry_dump_deep_transform_keys
2.395k (± 4.2%) i/s - 12.201k in 5.104192s
Comparison:
IPS: dump_symbol_names: 3024.9 i/s
IPS: as_dump_deep_transform_keys: 2403.5 i/s - 1.26x slower
IPS: dry_dump_deep_transform_keys: 2394.6 i/s - 1.26x slower
IPS: dump_stringify_names: 2389.7 i/s - 1.27x slower
Calculating -------------------------------------
MEM: dump_stringify_names
33.288k memsize ( 0.000 retained)
343.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dump_symbol_names
30.200k memsize ( 0.000 retained)
263.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: as_dump_deep_transform_keys
37.512k memsize ( 0.000 retained)
403.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dry_dump_deep_transform_keys
37.632k memsize ( 0.000 retained)
406.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
Comparison:
MEM: dump_symbol_names: 30200 allocated
MEM: dump_stringify_names: 33288 allocated - 1.10x more
MEM: as_dump_deep_transform_keys: 37512 allocated - 1.24x more
MEM: dry_dump_deep_transform_keys: 37632 allocated - 1.25x more
bundle exec ruby -v ./benchmark_dump.rb
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-darwin22]
Warming up --------------------------------------
IPS: dump_stringify_names
252.000 i/100ms
IPS: dump_symbol_names
323.000 i/100ms
IPS: as_dump_deep_transform_keys
245.000 i/100ms
IPS: dry_dump_deep_transform_keys
246.000 i/100ms
Calculating -------------------------------------
IPS: dump_stringify_names
2.522k (± 6.9%) i/s - 12.600k in 5.023261s
IPS: dump_symbol_names
3.157k (± 4.2%) i/s - 15.827k in 5.022963s
IPS: as_dump_deep_transform_keys
2.369k (± 3.5%) i/s - 12.005k in 5.074631s
IPS: dry_dump_deep_transform_keys
2.437k (± 3.5%) i/s - 12.300k in 5.053894s
Comparison:
IPS: dump_symbol_names: 3157.0 i/s
IPS: dump_stringify_names: 2521.6 i/s - 1.25x slower
IPS: dry_dump_deep_transform_keys: 2436.8 i/s - 1.30x slower
IPS: as_dump_deep_transform_keys: 2368.6 i/s - 1.33x slower
Calculating -------------------------------------
MEM: dump_stringify_names
33.288k memsize ( 0.000 retained)
343.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dump_symbol_names
30.200k memsize ( 0.000 retained)
263.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: as_dump_deep_transform_keys
37.512k memsize ( 0.000 retained)
403.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dry_dump_deep_transform_keys
37.632k memsize ( 0.000 retained)
406.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
Comparison:
MEM: dump_symbol_names: 30200 allocated
MEM: dump_stringify_names: 33288 allocated - 1.10x more
MEM: as_dump_deep_transform_keys: 37512 allocated - 1.24x more
MEM: dry_dump_deep_transform_keys: 37632 allocated - 1.25x more
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-darwin22]
Warming up --------------------------------------
IPS: dump_stringify_names
220.000 i/100ms
IPS: dump_symbol_names
278.000 i/100ms
IPS: as_dump_deep_transform_keys
226.000 i/100ms
IPS: dry_dump_deep_transform_keys
242.000 i/100ms
Calculating -------------------------------------
IPS: dump_stringify_names
2.524k (± 4.2%) i/s - 12.760k in 5.065400s
IPS: dump_symbol_names
3.038k (± 6.7%) i/s - 15.290k in 5.058300s
IPS: as_dump_deep_transform_keys
2.335k (± 4.2%) i/s - 11.752k in 5.042839s
IPS: dry_dump_deep_transform_keys
2.362k (± 4.4%) i/s - 11.858k in 5.030729s
Comparison:
IPS: dump_symbol_names: 3038.0 i/s
IPS: dump_stringify_names: 2523.6 i/s - 1.20x slower
IPS: dry_dump_deep_transform_keys: 2361.8 i/s - 1.29x slower
IPS: as_dump_deep_transform_keys: 2334.7 i/s - 1.30x slower
Calculating -------------------------------------
MEM: dump_stringify_names
33.288k memsize ( 0.000 retained)
343.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dump_symbol_names
30.200k memsize ( 0.000 retained)
263.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: as_dump_deep_transform_keys
37.512k memsize ( 0.000 retained)
403.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
MEM: dry_dump_deep_transform_keys
37.632k memsize ( 0.000 retained)
406.000 objects ( 0.000 retained)
50.000 strings ( 0.000 retained)
Comparison:
MEM: dump_symbol_names: 30200 allocated
MEM: dump_stringify_names: 33288 allocated - 1.10x more
MEM: as_dump_deep_transform_keys: 37512 allocated - 1.24x more
MEM: dry_dump_deep_transform_keys: 37632 allocated - 1.25x more
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment