1defmodule EncoderBench do
2  use Benchfella
3
4  # Lists
5  bench "lists (Poison)", [list: gen_list()] do
6    Poison.encode!(list)
7  end
8
9  bench "lists (jiffy)", [list: gen_list()] do
10    :jiffy.encode(list)
11  end
12
13  bench "lists (JSX)", [list: gen_list()] do
14    JSX.encode!(list)
15  end
16
17  bench "lists (JSON)", [list: gen_list()] do
18    JSON.encode!(list)
19  end
20
21  bench "lists (Jazz)", [list: gen_list()] do
22    Jazz.encode!(list)
23  end
24
25  # Maps
26  bench "maps (Poison)", [map: gen_map()] do
27    Poison.encode!(map)
28  end
29
30  bench "maps (jiffy)", [map: gen_map()]do
31    :jiffy.encode(map)
32  end
33
34  bench "maps (JSX)", [map: gen_map()]do
35    JSX.encode!(map)
36  end
37
38  bench "maps (JSON)", [map: gen_map()]do
39    JSON.encode!(map)
40  end
41
42  bench "maps (Jazz)", [map: gen_map()]do
43    Jazz.encode!(map)
44  end
45
46  # Strings
47  bench "strings (Poison)", [string: gen_string()]do
48    Poison.encode!(string)
49  end
50
51  bench "strings (jiffy)", [string: gen_string()]do
52    :jiffy.encode(string)
53  end
54
55  bench "strings (JSX)", [string: gen_string()]do
56    JSX.encode!(string)
57  end
58
59  bench "strings (JSON)", [string: gen_string()]do
60    JSON.encode!(string)
61  end
62
63  bench "strings (Jazz)", [string: gen_string()]do
64    Jazz.encode!(string)
65  end
66
67  # String escaping
68  bench "string escaping (Poison)", [string: gen_string()]do
69    Poison.encode!(string, escape: :unicode)
70  end
71
72  bench "string escaping (jiffy)", [string: gen_string()]do
73    :jiffy.encode(string, [:uescape])
74  end
75
76  bench "string escaping (JSX)", [string: gen_string()]do
77    JSX.encode!(string, [:uescape])
78  end
79
80  bench "string escaping (Jazz)", [string: gen_string()]do
81    Jazz.encode!(string, escape: :unicode)
82  end
83
84  # Structs
85  bench "structs (Poison)", [structs: gen_structs()]do
86    Poison.encode!(structs)
87  end
88
89  bench "structs (JSX)", [structs: gen_structs()]do
90    JSX.encode!(structs)
91  end
92
93  bench "structs (JSON)", [structs: gen_structs()]do
94    JSON.encode!(structs)
95  end
96
97  bench "structs (Jazz)", [structs: gen_structs()]do
98    Jazz.encode!(structs)
99  end
100
101  bench "Poison", [data: gen_data()]do
102    Poison.encode!(data)
103  end
104
105  bench "jiffy", [data: gen_data()]do
106    :jiffy.encode(data)
107  end
108
109  bench "JSX", [data: gen_data()]do
110    JSX.encode!(data)
111  end
112
113  bench "JSON", [data: gen_data()]do
114    JSON.encode!(data)
115  end
116
117  bench "Jazz", [data: gen_data()]do
118    Jazz.encode!(data)
119  end
120
121  bench "Poison (pretty)", [data: gen_data()]do
122    Poison.encode!(data, pretty: true)
123  end
124
125  bench "jiffy (pretty)", [data: gen_data()]do
126    :jiffy.encode(data, [:pretty])
127  end
128
129  bench "JSX (pretty)", [data: gen_data()]do
130    JSX.encode!(data) |> JSX.prettify!
131  end
132
133  bench "Jazz (pretty)", [data: gen_data()]do
134    Jazz.encode!(data, pretty: true)
135  end
136
137  defp gen_list do
138    1..1000 |> Enum.to_list
139  end
140
141  defp gen_map do
142    Stream.map(?A..?Z, &<<&1>>) |> Stream.with_index |> Enum.into(%{})
143  end
144
145  defp gen_string do
146    Path.expand("data/UTF-8-demo.txt", __DIR__) |> File.read!
147  end
148
149  defmodule Struct do
150    @derive [Poison.Encoder]
151    defstruct x: nil
152  end
153
154  defp gen_structs do
155    1..10 |> Enum.map(&(%Struct{x: &1}))
156  end
157
158  defp gen_data do
159    Path.expand("data/generated.json", __DIR__) |> File.read! |> Poison.decode!
160  end
161end
162