Last active
March 29, 2023 14:29
-
-
Save fnordfish/4b22aed6281800897e56399d6c53c0be to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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 |
This file contains hidden or 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
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 |
This file contains hidden or 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
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 |
This file contains hidden or 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
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