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