Skip to content

Commit d9f3dd1

Browse files
committed
added faster transformation to snake case
1 parent 51d222e commit d9f3dd1

11 files changed

+2121
-20
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
## CHANGELOG
22

3+
v0.10.0:
4+
- added high performance custom transformation to snake case (underscore), which is more than 2 times faster than the original
5+
36
v0.9.0:
47
- underscore replaces now hyphens (https://github.com/ruby2elixir/atomic_map/pull/5 + https://github.com/ruby2elixir/atomic_map/pull/6)

README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ iex> AtomicMap.convert(%{ "CamelCase" => [ %{"c" => 1}, %{"c" => 2}] }, safe: fa
2727
iex> AtomicMap.convert(%{ "CamelCase" => [ %{"c" => 1}, %{"c" => 2}] }, safe: false, underscore: false )
2828
%{CamelCase: [%{c: 1}, %{c: 2}]}
2929

30+
# in case you have extra large maps and you wish to use the faster custom transformation to underscore, you can pass `high_perf: true`
31+
AtomicMap.convert(%{ "CamelCase" => [ %{"c" => 1}, %{"c" => 2}] }, safe: false, high_perf: true)
32+
%{camel_case: [%{c: 1}, %{c: 2}]}
33+
3034
# hyphens are replaced
3135
iex> AtomicMap.convert(%{ "some-key" => [ %{"c" => 1}, %{"c" => 2}] }, safe: false, underscore: true )
3236
%{some_key: [%{c: 1}, %{c: 2}]}
@@ -41,7 +45,7 @@ AtomicMap.convert(%{ "CamelCase" => [ %{"c" => 1}, %{"c" => 2}] }, safe: true, i
4145
1. Add atomic_map to your list of dependencies in `mix.exs`:
4246

4347
def deps do
44-
[{:atomic_map, "~> 0.8"}]
48+
[{:atomic_map, "~> 0.10"}]
4549
end
4650

4751
## Todo:

bench/basic_bench.exs

+22
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ defmodule BasicBench do
1818
@long_string "StringShouldChange-some_stuffStringShouldChange-some_stuffStringShouldChange-some_stuffStringShouldChange-some_stuffStringShouldChange-some_stuff"
1919
@short_string "StringShouldChange-some_stuff"
2020

21+
@payload_camel_cased File.read!("bench/test-payload-camel-cased.json") |> Poison.decode!()
22+
@large_payload_camel_cased 1..100 |> Enum.reduce(%{}, fn(x, acc) -> Map.put(acc, "key#{x}", @payload_camel_cased) end)
23+
24+
@payload_snake_cased File.read!("bench/test-payload-camel-cased.json") |> Poison.decode!()
25+
@large_payload_snake_cased 1..100 |> Enum.reduce(%{}, fn(x, acc) -> Map.put(acc, "key#{x}", @payload_snake_cased) end)
26+
2127
bench "macro_underscore - long" do
2228
@long_string |> macro_underscore
2329
end
@@ -33,4 +39,20 @@ defmodule BasicBench do
3339
bench "regex_underscore - short" do
3440
@short_string |> regex_underscore
3541
end
42+
43+
bench "large dict camel cased with low perf underscore" do
44+
@large_payload_camel_cased |> AtomicMap.convert(safe: false, underscore: true, high_perf: false)
45+
end
46+
47+
bench "large dict camel cased with high perf underscore" do
48+
@large_payload_camel_cased |> AtomicMap.convert(safe: false, underscore: true, high_perf: true)
49+
end
50+
51+
bench "large dict snake cased with low perf underscore" do
52+
@large_payload_snake_cased |> AtomicMap.convert(safe: false, underscore: true, high_perf: false)
53+
end
54+
55+
bench "large dict snake cased with high perf underscore" do
56+
@large_payload_snake_cased |> AtomicMap.convert(safe: false, underscore: true, high_perf: true)
57+
end
3658
end

bench/snapshots/2016-05-04_22-21-57.snapshot

-6
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
duration:1.0;mem stats:false;sys mem stats:false
2+
module;test;tags;iterations;elapsed
3+
BasicBench large dict camel cased with high perf underscore 10 1256231
4+
BasicBench large dict camel cased with low perf underscore 5 1467331
5+
BasicBench large dict snake cased with high perf underscore 10 1223200
6+
BasicBench large dict snake cased with low perf underscore 5 1507264
7+
BasicBench macro_underscore - long 50000 2172177
8+
BasicBench macro_underscore - short 100000 1185552
9+
BasicBench regex_underscore - long 50000 2968897
10+
BasicBench regex_underscore - short 100000 1680492

0 commit comments

Comments
 (0)