An Ecto SQLite3 adapter.
0

Configure Feed

Select the types of activity you want to include in your feed.

Update benchmarks, run them, check in results as markdown files (#18)

* update benchmarks, run all but the all one and check in results

* format

* clean up lockfile

authored by

Kevin Lang and committed by
GitHub
(Mar 23, 2021, 11:24 PM EDT) 3ef1bf4d a3569e2b

+1524 -42
+1 -1
.formatter.exs
··· 2 2 [ 3 3 inputs: [ 4 4 "{mix,.formatter}.exs", 5 - "{lib,test}/**/*.{ex,exs}" 5 + "{lib,test,bench}/**/*.{ex,exs}" 6 6 ], 7 7 line_length: 88 8 8 ]
+6
README.md
··· 39 39 config :my_app, MyApp.Repo, 40 40 database: "path/to/my/database.db", 41 41 ``` 42 + 43 + ## Benchmarks 44 + 45 + We have some benchmarks comparing it against the `MySQL` and `Postgres` adapters. 46 + 47 + You can read more about those at [bench/README.md](bench/README.md).
+16 -3
bench/README.md
··· 1 1 # Ecto Benchmarks 2 2 3 + ## Results 4 + 5 + | Benchmark | Description | 6 + | --------- | ------------ | 7 + | [load](results/load.md) | tracks performance of loading "raw" data into ecto structures | 8 + | [to_sql](results/to_sql.md) | tracks performance of parsing `Ecto.Query` structures into "raw" SQL query strings | 9 + | [insert](results/insert.md) | tracks performance of inserting changesets and structs in the database with `Repo.insert!/1` function | 10 + 11 + For reference, these results were run with a Sabrent Rocket Q 1TB NVMe SSD. 12 + 13 + ## Running the benchmarks 14 + 3 15 Ecto has a benchmark suite to track performance of sensitive operations. Benchmarks 4 16 are run using the [Benchee](https://github.com/PragTob/benchee) library and 5 17 need PostgreSQL and MySQL up and running. ··· 28 40 You can also run a benchmark individually by giving the path to the benchmark 29 41 script instead of `bench/bench_helper.exs`. 30 42 31 - # Docker 32 - I had Postgres already installed and running locally, but needed to get MySQL up and running. The easiest way to do this is with this command: 43 + ### Docker 44 + The easiest way to setup mysql and postgresql for the benchmarks is via Docker. Run the following commands to get an instance of each running. 33 45 34 46 ``` 35 - docker run -p 3306:3306 --name mysql_server -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7 47 + docker run -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7 48 + docker run -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:13.2 36 49 ```
+204
bench/results/insert.md
··· 1 + 2 + # Benchmark 3 + 4 + Benchmark run from 2021-03-24 02:05:58.706995Z UTC 5 + 6 + ## System 7 + 8 + Benchmark suite executing on the following system: 9 + 10 + <table style="width: 1%"> 11 + <tr> 12 + <th style="width: 1%; white-space: nowrap">Operating System</th> 13 + <td>Linux</td> 14 + </tr><tr> 15 + <th style="white-space: nowrap">CPU Information</th> 16 + <td style="white-space: nowrap">AMD Ryzen 7 PRO 4750U with Radeon Graphics</td> 17 + </tr><tr> 18 + <th style="white-space: nowrap">Number of Available Cores</th> 19 + <td style="white-space: nowrap">16</td> 20 + </tr><tr> 21 + <th style="white-space: nowrap">Available Memory</th> 22 + <td style="white-space: nowrap">14.92 GB</td> 23 + </tr><tr> 24 + <th style="white-space: nowrap">Elixir Version</th> 25 + <td style="white-space: nowrap">1.11.3</td> 26 + </tr><tr> 27 + <th style="white-space: nowrap">Erlang Version</th> 28 + <td style="white-space: nowrap">23.2.6</td> 29 + </tr> 30 + </table> 31 + 32 + ## Configuration 33 + 34 + Benchmark suite executing with the following configuration: 35 + 36 + <table style="width: 1%"> 37 + <tr> 38 + <th style="width: 1%">:time</th> 39 + <td style="white-space: nowrap">5 s</td> 40 + </tr><tr> 41 + <th>:parallel</th> 42 + <td style="white-space: nowrap">1</td> 43 + </tr><tr> 44 + <th>:warmup</th> 45 + <td style="white-space: nowrap">2 s</td> 46 + </tr> 47 + </table> 48 + 49 + ## Statistics 50 + 51 + 52 + 53 + 54 + __Input: Changeset__ 55 + 56 + Run Time 57 + 58 + <table style="width: 1%"> 59 + <tr> 60 + <th>Name</th> 61 + <th style="text-align: right">IPS</th> 62 + <th style="text-align: right">Average</th> 63 + <th style="text-align: right">Devitation</th> 64 + <th style="text-align: right">Median</th> 65 + <th style="text-align: right">99th&nbsp;%</th> 66 + </tr> 67 + 68 + <tr> 69 + <td style="white-space: nowrap">SQLite3 Insert</td> 70 + <td style="white-space: nowrap; text-align: right">7218.07</td> 71 + <td style="white-space: nowrap; text-align: right">0.139 ms</td> 72 + <td style="white-space: nowrap; text-align: right">±43.60%</td> 73 + <td style="white-space: nowrap; text-align: right">0.123 ms</td> 74 + <td style="white-space: nowrap; text-align: right">0.37 ms</td> 75 + </tr> 76 + 77 + <tr> 78 + <td style="white-space: nowrap">Pg Insert</td> 79 + <td style="white-space: nowrap; text-align: right">421.57</td> 80 + <td style="white-space: nowrap; text-align: right">2.37 ms</td> 81 + <td style="white-space: nowrap; text-align: right">±12.13%</td> 82 + <td style="white-space: nowrap; text-align: right">2.37 ms</td> 83 + <td style="white-space: nowrap; text-align: right">2.90 ms</td> 84 + </tr> 85 + 86 + <tr> 87 + <td style="white-space: nowrap">MyXQL Insert</td> 88 + <td style="white-space: nowrap; text-align: right">284.25</td> 89 + <td style="white-space: nowrap; text-align: right">3.52 ms</td> 90 + <td style="white-space: nowrap; text-align: right">±13.34%</td> 91 + <td style="white-space: nowrap; text-align: right">3.53 ms</td> 92 + <td style="white-space: nowrap; text-align: right">5.05 ms</td> 93 + </tr> 94 + 95 + </table> 96 + 97 + 98 + Comparison 99 + 100 + <table style="width: 1%"> 101 + <tr> 102 + <th>Name</th> 103 + <th style="text-align: right">IPS</th> 104 + <th style="text-align: right">Slower</th> 105 + <tr> 106 + <td style="white-space: nowrap">SQLite3 Insert</td> 107 + <td style="white-space: nowrap;text-align: right">7218.07</td> 108 + <td>&nbsp;</td> 109 + </tr> 110 + 111 + <tr> 112 + <td style="white-space: nowrap">Pg Insert</td> 113 + <td style="white-space: nowrap; text-align: right">421.57</td> 114 + <td style="white-space: nowrap; text-align: right">17.12x</td> 115 + </tr> 116 + 117 + <tr> 118 + <td style="white-space: nowrap">MyXQL Insert</td> 119 + <td style="white-space: nowrap; text-align: right">284.25</td> 120 + <td style="white-space: nowrap; text-align: right">25.39x</td> 121 + </tr> 122 + 123 + </table> 124 + 125 + 126 + 127 + <hr/> 128 + 129 + 130 + __Input: Struct__ 131 + 132 + Run Time 133 + 134 + <table style="width: 1%"> 135 + <tr> 136 + <th>Name</th> 137 + <th style="text-align: right">IPS</th> 138 + <th style="text-align: right">Average</th> 139 + <th style="text-align: right">Devitation</th> 140 + <th style="text-align: right">Median</th> 141 + <th style="text-align: right">99th&nbsp;%</th> 142 + </tr> 143 + 144 + <tr> 145 + <td style="white-space: nowrap">SQLite3 Insert</td> 146 + <td style="white-space: nowrap; text-align: right">7765.76</td> 147 + <td style="white-space: nowrap; text-align: right">0.129 ms</td> 148 + <td style="white-space: nowrap; text-align: right">±32.88%</td> 149 + <td style="white-space: nowrap; text-align: right">0.122 ms</td> 150 + <td style="white-space: nowrap; text-align: right">0.28 ms</td> 151 + </tr> 152 + 153 + <tr> 154 + <td style="white-space: nowrap">Pg Insert</td> 155 + <td style="white-space: nowrap; text-align: right">422.86</td> 156 + <td style="white-space: nowrap; text-align: right">2.36 ms</td> 157 + <td style="white-space: nowrap; text-align: right">±10.49%</td> 158 + <td style="white-space: nowrap; text-align: right">2.36 ms</td> 159 + <td style="white-space: nowrap; text-align: right">3.02 ms</td> 160 + </tr> 161 + 162 + <tr> 163 + <td style="white-space: nowrap">MyXQL Insert</td> 164 + <td style="white-space: nowrap; text-align: right">274.00</td> 165 + <td style="white-space: nowrap; text-align: right">3.65 ms</td> 166 + <td style="white-space: nowrap; text-align: right">±38.43%</td> 167 + <td style="white-space: nowrap; text-align: right">3.59 ms</td> 168 + <td style="white-space: nowrap; text-align: right">4.75 ms</td> 169 + </tr> 170 + 171 + </table> 172 + 173 + 174 + Comparison 175 + 176 + <table style="width: 1%"> 177 + <tr> 178 + <th>Name</th> 179 + <th style="text-align: right">IPS</th> 180 + <th style="text-align: right">Slower</th> 181 + <tr> 182 + <td style="white-space: nowrap">SQLite3 Insert</td> 183 + <td style="white-space: nowrap;text-align: right">7765.76</td> 184 + <td>&nbsp;</td> 185 + </tr> 186 + 187 + <tr> 188 + <td style="white-space: nowrap">Pg Insert</td> 189 + <td style="white-space: nowrap; text-align: right">422.86</td> 190 + <td style="white-space: nowrap; text-align: right">18.37x</td> 191 + </tr> 192 + 193 + <tr> 194 + <td style="white-space: nowrap">MyXQL Insert</td> 195 + <td style="white-space: nowrap; text-align: right">274.00</td> 196 + <td style="white-space: nowrap; text-align: right">28.34x</td> 197 + </tr> 198 + 199 + </table> 200 + 201 + 202 + 203 + <hr/> 204 +
+508
bench/results/load.md
··· 1 + 2 + # Benchmark 3 + 4 + Benchmark run from 2021-03-24 01:58:24.995583Z UTC 5 + 6 + ## System 7 + 8 + Benchmark suite executing on the following system: 9 + 10 + <table style="width: 1%"> 11 + <tr> 12 + <th style="width: 1%; white-space: nowrap">Operating System</th> 13 + <td>Linux</td> 14 + </tr><tr> 15 + <th style="white-space: nowrap">CPU Information</th> 16 + <td style="white-space: nowrap">AMD Ryzen 7 PRO 4750U with Radeon Graphics</td> 17 + </tr><tr> 18 + <th style="white-space: nowrap">Number of Available Cores</th> 19 + <td style="white-space: nowrap">16</td> 20 + </tr><tr> 21 + <th style="white-space: nowrap">Available Memory</th> 22 + <td style="white-space: nowrap">14.92 GB</td> 23 + </tr><tr> 24 + <th style="white-space: nowrap">Elixir Version</th> 25 + <td style="white-space: nowrap">1.11.3</td> 26 + </tr><tr> 27 + <th style="white-space: nowrap">Erlang Version</th> 28 + <td style="white-space: nowrap">23.2.6</td> 29 + </tr> 30 + </table> 31 + 32 + ## Configuration 33 + 34 + Benchmark suite executing with the following configuration: 35 + 36 + <table style="width: 1%"> 37 + <tr> 38 + <th style="width: 1%">:time</th> 39 + <td style="white-space: nowrap">5 s</td> 40 + </tr><tr> 41 + <th>:parallel</th> 42 + <td style="white-space: nowrap">1</td> 43 + </tr><tr> 44 + <th>:warmup</th> 45 + <td style="white-space: nowrap">2 s</td> 46 + </tr> 47 + </table> 48 + 49 + ## Statistics 50 + 51 + 52 + 53 + 54 + __Input: Big 1 Million__ 55 + 56 + Run Time 57 + 58 + <table style="width: 1%"> 59 + <tr> 60 + <th>Name</th> 61 + <th style="text-align: right">IPS</th> 62 + <th style="text-align: right">Average</th> 63 + <th style="text-align: right">Devitation</th> 64 + <th style="text-align: right">Median</th> 65 + <th style="text-align: right">99th&nbsp;%</th> 66 + </tr> 67 + 68 + <tr> 69 + <td style="white-space: nowrap">SQLite3 Loader</td> 70 + <td style="white-space: nowrap; text-align: right">0.35</td> 71 + <td style="white-space: nowrap; text-align: right">2.82 s</td> 72 + <td style="white-space: nowrap; text-align: right">±15.78%</td> 73 + <td style="white-space: nowrap; text-align: right">2.82 s</td> 74 + <td style="white-space: nowrap; text-align: right">3.13 s</td> 75 + </tr> 76 + 77 + <tr> 78 + <td style="white-space: nowrap">Pg Loader</td> 79 + <td style="white-space: nowrap; text-align: right">0.34</td> 80 + <td style="white-space: nowrap; text-align: right">2.92 s</td> 81 + <td style="white-space: nowrap; text-align: right">±17.97%</td> 82 + <td style="white-space: nowrap; text-align: right">2.92 s</td> 83 + <td style="white-space: nowrap; text-align: right">3.29 s</td> 84 + </tr> 85 + 86 + <tr> 87 + <td style="white-space: nowrap">MyXQL Loader</td> 88 + <td style="white-space: nowrap; text-align: right">0.33</td> 89 + <td style="white-space: nowrap; text-align: right">2.99 s</td> 90 + <td style="white-space: nowrap; text-align: right">±13.08%</td> 91 + <td style="white-space: nowrap; text-align: right">2.99 s</td> 92 + <td style="white-space: nowrap; text-align: right">3.26 s</td> 93 + </tr> 94 + 95 + </table> 96 + 97 + 98 + Comparison 99 + 100 + <table style="width: 1%"> 101 + <tr> 102 + <th>Name</th> 103 + <th style="text-align: right">IPS</th> 104 + <th style="text-align: right">Slower</th> 105 + <tr> 106 + <td style="white-space: nowrap">SQLite3 Loader</td> 107 + <td style="white-space: nowrap;text-align: right">0.35</td> 108 + <td>&nbsp;</td> 109 + </tr> 110 + 111 + <tr> 112 + <td style="white-space: nowrap">Pg Loader</td> 113 + <td style="white-space: nowrap; text-align: right">0.34</td> 114 + <td style="white-space: nowrap; text-align: right">1.04x</td> 115 + </tr> 116 + 117 + <tr> 118 + <td style="white-space: nowrap">MyXQL Loader</td> 119 + <td style="white-space: nowrap; text-align: right">0.33</td> 120 + <td style="white-space: nowrap; text-align: right">1.06x</td> 121 + </tr> 122 + 123 + </table> 124 + 125 + 126 + 127 + <hr/> 128 + 129 + 130 + __Input: Date attr__ 131 + 132 + Run Time 133 + 134 + <table style="width: 1%"> 135 + <tr> 136 + <th>Name</th> 137 + <th style="text-align: right">IPS</th> 138 + <th style="text-align: right">Average</th> 139 + <th style="text-align: right">Devitation</th> 140 + <th style="text-align: right">Median</th> 141 + <th style="text-align: right">99th&nbsp;%</th> 142 + </tr> 143 + 144 + <tr> 145 + <td style="white-space: nowrap">Pg Loader</td> 146 + <td style="white-space: nowrap; text-align: right">4.61</td> 147 + <td style="white-space: nowrap; text-align: right">217.08 ms</td> 148 + <td style="white-space: nowrap; text-align: right">±13.97%</td> 149 + <td style="white-space: nowrap; text-align: right">214.42 ms</td> 150 + <td style="white-space: nowrap; text-align: right">271.56 ms</td> 151 + </tr> 152 + 153 + <tr> 154 + <td style="white-space: nowrap">MyXQL Loader</td> 155 + <td style="white-space: nowrap; text-align: right">4.56</td> 156 + <td style="white-space: nowrap; text-align: right">219.25 ms</td> 157 + <td style="white-space: nowrap; text-align: right">±18.19%</td> 158 + <td style="white-space: nowrap; text-align: right">210.43 ms</td> 159 + <td style="white-space: nowrap; text-align: right">300.02 ms</td> 160 + </tr> 161 + 162 + <tr> 163 + <td style="white-space: nowrap">SQLite3 Loader</td> 164 + <td style="white-space: nowrap; text-align: right">4.49</td> 165 + <td style="white-space: nowrap; text-align: right">222.95 ms</td> 166 + <td style="white-space: nowrap; text-align: right">±15.03%</td> 167 + <td style="white-space: nowrap; text-align: right">232.42 ms</td> 168 + <td style="white-space: nowrap; text-align: right">266.39 ms</td> 169 + </tr> 170 + 171 + </table> 172 + 173 + 174 + Comparison 175 + 176 + <table style="width: 1%"> 177 + <tr> 178 + <th>Name</th> 179 + <th style="text-align: right">IPS</th> 180 + <th style="text-align: right">Slower</th> 181 + <tr> 182 + <td style="white-space: nowrap">Pg Loader</td> 183 + <td style="white-space: nowrap;text-align: right">4.61</td> 184 + <td>&nbsp;</td> 185 + </tr> 186 + 187 + <tr> 188 + <td style="white-space: nowrap">MyXQL Loader</td> 189 + <td style="white-space: nowrap; text-align: right">4.56</td> 190 + <td style="white-space: nowrap; text-align: right">1.01x</td> 191 + </tr> 192 + 193 + <tr> 194 + <td style="white-space: nowrap">SQLite3 Loader</td> 195 + <td style="white-space: nowrap; text-align: right">4.49</td> 196 + <td style="white-space: nowrap; text-align: right">1.03x</td> 197 + </tr> 198 + 199 + </table> 200 + 201 + 202 + 203 + <hr/> 204 + 205 + 206 + __Input: Medium 100 Thousand__ 207 + 208 + Run Time 209 + 210 + <table style="width: 1%"> 211 + <tr> 212 + <th>Name</th> 213 + <th style="text-align: right">IPS</th> 214 + <th style="text-align: right">Average</th> 215 + <th style="text-align: right">Devitation</th> 216 + <th style="text-align: right">Median</th> 217 + <th style="text-align: right">99th&nbsp;%</th> 218 + </tr> 219 + 220 + <tr> 221 + <td style="white-space: nowrap">MyXQL Loader</td> 222 + <td style="white-space: nowrap; text-align: right">4.53</td> 223 + <td style="white-space: nowrap; text-align: right">220.75 ms</td> 224 + <td style="white-space: nowrap; text-align: right">±15.57%</td> 225 + <td style="white-space: nowrap; text-align: right">209.17 ms</td> 226 + <td style="white-space: nowrap; text-align: right">287.22 ms</td> 227 + </tr> 228 + 229 + <tr> 230 + <td style="white-space: nowrap">Pg Loader</td> 231 + <td style="white-space: nowrap; text-align: right">4.40</td> 232 + <td style="white-space: nowrap; text-align: right">227.35 ms</td> 233 + <td style="white-space: nowrap; text-align: right">±16.30%</td> 234 + <td style="white-space: nowrap; text-align: right">222.39 ms</td> 235 + <td style="white-space: nowrap; text-align: right">335.90 ms</td> 236 + </tr> 237 + 238 + <tr> 239 + <td style="white-space: nowrap">SQLite3 Loader</td> 240 + <td style="white-space: nowrap; text-align: right">4.35</td> 241 + <td style="white-space: nowrap; text-align: right">230.09 ms</td> 242 + <td style="white-space: nowrap; text-align: right">±19.61%</td> 243 + <td style="white-space: nowrap; text-align: right">236.94 ms</td> 244 + <td style="white-space: nowrap; text-align: right">309.96 ms</td> 245 + </tr> 246 + 247 + </table> 248 + 249 + 250 + Comparison 251 + 252 + <table style="width: 1%"> 253 + <tr> 254 + <th>Name</th> 255 + <th style="text-align: right">IPS</th> 256 + <th style="text-align: right">Slower</th> 257 + <tr> 258 + <td style="white-space: nowrap">MyXQL Loader</td> 259 + <td style="white-space: nowrap;text-align: right">4.53</td> 260 + <td>&nbsp;</td> 261 + </tr> 262 + 263 + <tr> 264 + <td style="white-space: nowrap">Pg Loader</td> 265 + <td style="white-space: nowrap; text-align: right">4.40</td> 266 + <td style="white-space: nowrap; text-align: right">1.03x</td> 267 + </tr> 268 + 269 + <tr> 270 + <td style="white-space: nowrap">SQLite3 Loader</td> 271 + <td style="white-space: nowrap; text-align: right">4.35</td> 272 + <td style="white-space: nowrap; text-align: right">1.04x</td> 273 + </tr> 274 + 275 + </table> 276 + 277 + 278 + 279 + <hr/> 280 + 281 + 282 + __Input: Small 1 Thousand__ 283 + 284 + Run Time 285 + 286 + <table style="width: 1%"> 287 + <tr> 288 + <th>Name</th> 289 + <th style="text-align: right">IPS</th> 290 + <th style="text-align: right">Average</th> 291 + <th style="text-align: right">Devitation</th> 292 + <th style="text-align: right">Median</th> 293 + <th style="text-align: right">99th&nbsp;%</th> 294 + </tr> 295 + 296 + <tr> 297 + <td style="white-space: nowrap">Pg Loader</td> 298 + <td style="white-space: nowrap; text-align: right">883.24</td> 299 + <td style="white-space: nowrap; text-align: right">1.13 ms</td> 300 + <td style="white-space: nowrap; text-align: right">±62.88%</td> 301 + <td style="white-space: nowrap; text-align: right">0.93 ms</td> 302 + <td style="white-space: nowrap; text-align: right">2.71 ms</td> 303 + </tr> 304 + 305 + <tr> 306 + <td style="white-space: nowrap">SQLite3 Loader</td> 307 + <td style="white-space: nowrap; text-align: right">873.53</td> 308 + <td style="white-space: nowrap; text-align: right">1.14 ms</td> 309 + <td style="white-space: nowrap; text-align: right">±60.06%</td> 310 + <td style="white-space: nowrap; text-align: right">0.92 ms</td> 311 + <td style="white-space: nowrap; text-align: right">2.90 ms</td> 312 + </tr> 313 + 314 + <tr> 315 + <td style="white-space: nowrap">MyXQL Loader</td> 316 + <td style="white-space: nowrap; text-align: right">862.33</td> 317 + <td style="white-space: nowrap; text-align: right">1.16 ms</td> 318 + <td style="white-space: nowrap; text-align: right">±62.27%</td> 319 + <td style="white-space: nowrap; text-align: right">0.92 ms</td> 320 + <td style="white-space: nowrap; text-align: right">2.77 ms</td> 321 + </tr> 322 + 323 + </table> 324 + 325 + 326 + Comparison 327 + 328 + <table style="width: 1%"> 329 + <tr> 330 + <th>Name</th> 331 + <th style="text-align: right">IPS</th> 332 + <th style="text-align: right">Slower</th> 333 + <tr> 334 + <td style="white-space: nowrap">Pg Loader</td> 335 + <td style="white-space: nowrap;text-align: right">883.24</td> 336 + <td>&nbsp;</td> 337 + </tr> 338 + 339 + <tr> 340 + <td style="white-space: nowrap">SQLite3 Loader</td> 341 + <td style="white-space: nowrap; text-align: right">873.53</td> 342 + <td style="white-space: nowrap; text-align: right">1.01x</td> 343 + </tr> 344 + 345 + <tr> 346 + <td style="white-space: nowrap">MyXQL Loader</td> 347 + <td style="white-space: nowrap; text-align: right">862.33</td> 348 + <td style="white-space: nowrap; text-align: right">1.02x</td> 349 + </tr> 350 + 351 + </table> 352 + 353 + 354 + 355 + <hr/> 356 + 357 + 358 + __Input: Time attr__ 359 + 360 + Run Time 361 + 362 + <table style="width: 1%"> 363 + <tr> 364 + <th>Name</th> 365 + <th style="text-align: right">IPS</th> 366 + <th style="text-align: right">Average</th> 367 + <th style="text-align: right">Devitation</th> 368 + <th style="text-align: right">Median</th> 369 + <th style="text-align: right">99th&nbsp;%</th> 370 + </tr> 371 + 372 + <tr> 373 + <td style="white-space: nowrap">SQLite3 Loader</td> 374 + <td style="white-space: nowrap; text-align: right">3.40</td> 375 + <td style="white-space: nowrap; text-align: right">294.30 ms</td> 376 + <td style="white-space: nowrap; text-align: right">±15.60%</td> 377 + <td style="white-space: nowrap; text-align: right">281.23 ms</td> 378 + <td style="white-space: nowrap; text-align: right">367.65 ms</td> 379 + </tr> 380 + 381 + <tr> 382 + <td style="white-space: nowrap">MyXQL Loader</td> 383 + <td style="white-space: nowrap; text-align: right">3.18</td> 384 + <td style="white-space: nowrap; text-align: right">314.55 ms</td> 385 + <td style="white-space: nowrap; text-align: right">±17.11%</td> 386 + <td style="white-space: nowrap; text-align: right">313.35 ms</td> 387 + <td style="white-space: nowrap; text-align: right">415.89 ms</td> 388 + </tr> 389 + 390 + <tr> 391 + <td style="white-space: nowrap">Pg Loader</td> 392 + <td style="white-space: nowrap; text-align: right">3.03</td> 393 + <td style="white-space: nowrap; text-align: right">329.99 ms</td> 394 + <td style="white-space: nowrap; text-align: right">±16.46%</td> 395 + <td style="white-space: nowrap; text-align: right">321.68 ms</td> 396 + <td style="white-space: nowrap; text-align: right">457.42 ms</td> 397 + </tr> 398 + 399 + </table> 400 + 401 + 402 + Comparison 403 + 404 + <table style="width: 1%"> 405 + <tr> 406 + <th>Name</th> 407 + <th style="text-align: right">IPS</th> 408 + <th style="text-align: right">Slower</th> 409 + <tr> 410 + <td style="white-space: nowrap">SQLite3 Loader</td> 411 + <td style="white-space: nowrap;text-align: right">3.40</td> 412 + <td>&nbsp;</td> 413 + </tr> 414 + 415 + <tr> 416 + <td style="white-space: nowrap">MyXQL Loader</td> 417 + <td style="white-space: nowrap; text-align: right">3.18</td> 418 + <td style="white-space: nowrap; text-align: right">1.07x</td> 419 + </tr> 420 + 421 + <tr> 422 + <td style="white-space: nowrap">Pg Loader</td> 423 + <td style="white-space: nowrap; text-align: right">3.03</td> 424 + <td style="white-space: nowrap; text-align: right">1.12x</td> 425 + </tr> 426 + 427 + </table> 428 + 429 + 430 + 431 + <hr/> 432 + 433 + 434 + __Input: UUID attr__ 435 + 436 + Run Time 437 + 438 + <table style="width: 1%"> 439 + <tr> 440 + <th>Name</th> 441 + <th style="text-align: right">IPS</th> 442 + <th style="text-align: right">Average</th> 443 + <th style="text-align: right">Devitation</th> 444 + <th style="text-align: right">Median</th> 445 + <th style="text-align: right">99th&nbsp;%</th> 446 + </tr> 447 + 448 + <tr> 449 + <td style="white-space: nowrap">SQLite3 Loader</td> 450 + <td style="white-space: nowrap; text-align: right">3.61</td> 451 + <td style="white-space: nowrap; text-align: right">277.20 ms</td> 452 + <td style="white-space: nowrap; text-align: right">±16.59%</td> 453 + <td style="white-space: nowrap; text-align: right">266.05 ms</td> 454 + <td style="white-space: nowrap; text-align: right">372.08 ms</td> 455 + </tr> 456 + 457 + <tr> 458 + <td style="white-space: nowrap">Pg Loader</td> 459 + <td style="white-space: nowrap; text-align: right">2.75</td> 460 + <td style="white-space: nowrap; text-align: right">363.06 ms</td> 461 + <td style="white-space: nowrap; text-align: right">±14.14%</td> 462 + <td style="white-space: nowrap; text-align: right">382.70 ms</td> 463 + <td style="white-space: nowrap; text-align: right">437.37 ms</td> 464 + </tr> 465 + 466 + <tr> 467 + <td style="white-space: nowrap">MyXQL Loader</td> 468 + <td style="white-space: nowrap; text-align: right">2.73</td> 469 + <td style="white-space: nowrap; text-align: right">365.91 ms</td> 470 + <td style="white-space: nowrap; text-align: right">±19.81%</td> 471 + <td style="white-space: nowrap; text-align: right">367.23 ms</td> 472 + <td style="white-space: nowrap; text-align: right">515.29 ms</td> 473 + </tr> 474 + 475 + </table> 476 + 477 + 478 + Comparison 479 + 480 + <table style="width: 1%"> 481 + <tr> 482 + <th>Name</th> 483 + <th style="text-align: right">IPS</th> 484 + <th style="text-align: right">Slower</th> 485 + <tr> 486 + <td style="white-space: nowrap">SQLite3 Loader</td> 487 + <td style="white-space: nowrap;text-align: right">3.61</td> 488 + <td>&nbsp;</td> 489 + </tr> 490 + 491 + <tr> 492 + <td style="white-space: nowrap">Pg Loader</td> 493 + <td style="white-space: nowrap; text-align: right">2.75</td> 494 + <td style="white-space: nowrap; text-align: right">1.31x</td> 495 + </tr> 496 + 497 + <tr> 498 + <td style="white-space: nowrap">MyXQL Loader</td> 499 + <td style="white-space: nowrap; text-align: right">2.73</td> 500 + <td style="white-space: nowrap; text-align: right">1.32x</td> 501 + </tr> 502 + 503 + </table> 504 + 505 + 506 + 507 + <hr/> 508 +
+736
bench/results/to_sql.md
··· 1 + 2 + # Benchmark 3 + 4 + Benchmark run from 2021-03-24 02:02:16.278354Z UTC 5 + 6 + ## System 7 + 8 + Benchmark suite executing on the following system: 9 + 10 + <table style="width: 1%"> 11 + <tr> 12 + <th style="width: 1%; white-space: nowrap">Operating System</th> 13 + <td>Linux</td> 14 + </tr><tr> 15 + <th style="white-space: nowrap">CPU Information</th> 16 + <td style="white-space: nowrap">AMD Ryzen 7 PRO 4750U with Radeon Graphics</td> 17 + </tr><tr> 18 + <th style="white-space: nowrap">Number of Available Cores</th> 19 + <td style="white-space: nowrap">16</td> 20 + </tr><tr> 21 + <th style="white-space: nowrap">Available Memory</th> 22 + <td style="white-space: nowrap">14.92 GB</td> 23 + </tr><tr> 24 + <th style="white-space: nowrap">Elixir Version</th> 25 + <td style="white-space: nowrap">1.11.3</td> 26 + </tr><tr> 27 + <th style="white-space: nowrap">Erlang Version</th> 28 + <td style="white-space: nowrap">23.2.6</td> 29 + </tr> 30 + </table> 31 + 32 + ## Configuration 33 + 34 + Benchmark suite executing with the following configuration: 35 + 36 + <table style="width: 1%"> 37 + <tr> 38 + <th style="width: 1%">:time</th> 39 + <td style="white-space: nowrap">5 s</td> 40 + </tr><tr> 41 + <th>:parallel</th> 42 + <td style="white-space: nowrap">1</td> 43 + </tr><tr> 44 + <th>:warmup</th> 45 + <td style="white-space: nowrap">2 s</td> 46 + </tr> 47 + </table> 48 + 49 + ## Statistics 50 + 51 + 52 + 53 + 54 + __Input: Complex Query 2 Joins__ 55 + 56 + Run Time 57 + 58 + <table style="width: 1%"> 59 + <tr> 60 + <th>Name</th> 61 + <th style="text-align: right">IPS</th> 62 + <th style="text-align: right">Average</th> 63 + <th style="text-align: right">Devitation</th> 64 + <th style="text-align: right">Median</th> 65 + <th style="text-align: right">99th&nbsp;%</th> 66 + </tr> 67 + 68 + <tr> 69 + <td style="white-space: nowrap">MyXQL Query Builder</td> 70 + <td style="white-space: nowrap; text-align: right">105.28 K</td> 71 + <td style="white-space: nowrap; text-align: right">9.50 μs</td> 72 + <td style="white-space: nowrap; text-align: right">±116.92%</td> 73 + <td style="white-space: nowrap; text-align: right">8.66 μs</td> 74 + <td style="white-space: nowrap; text-align: right">24.79 μs</td> 75 + </tr> 76 + 77 + <tr> 78 + <td style="white-space: nowrap">Pg Query Builder</td> 79 + <td style="white-space: nowrap; text-align: right">96.97 K</td> 80 + <td style="white-space: nowrap; text-align: right">10.31 μs</td> 81 + <td style="white-space: nowrap; text-align: right">±220.90%</td> 82 + <td style="white-space: nowrap; text-align: right">8.66 μs</td> 83 + <td style="white-space: nowrap; text-align: right">26.75 μs</td> 84 + </tr> 85 + 86 + <tr> 87 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 88 + <td style="white-space: nowrap; text-align: right">90.46 K</td> 89 + <td style="white-space: nowrap; text-align: right">11.05 μs</td> 90 + <td style="white-space: nowrap; text-align: right">±204.34%</td> 91 + <td style="white-space: nowrap; text-align: right">8.66 μs</td> 92 + <td style="white-space: nowrap; text-align: right">39.53 μs</td> 93 + </tr> 94 + 95 + </table> 96 + 97 + 98 + Comparison 99 + 100 + <table style="width: 1%"> 101 + <tr> 102 + <th>Name</th> 103 + <th style="text-align: right">IPS</th> 104 + <th style="text-align: right">Slower</th> 105 + <tr> 106 + <td style="white-space: nowrap">MyXQL Query Builder</td> 107 + <td style="white-space: nowrap;text-align: right">105.28 K</td> 108 + <td>&nbsp;</td> 109 + </tr> 110 + 111 + <tr> 112 + <td style="white-space: nowrap">Pg Query Builder</td> 113 + <td style="white-space: nowrap; text-align: right">96.97 K</td> 114 + <td style="white-space: nowrap; text-align: right">1.09x</td> 115 + </tr> 116 + 117 + <tr> 118 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 119 + <td style="white-space: nowrap; text-align: right">90.46 K</td> 120 + <td style="white-space: nowrap; text-align: right">1.16x</td> 121 + </tr> 122 + 123 + </table> 124 + 125 + 126 + 127 + <hr/> 128 + 129 + 130 + __Input: Complex Query 4 Joins__ 131 + 132 + Run Time 133 + 134 + <table style="width: 1%"> 135 + <tr> 136 + <th>Name</th> 137 + <th style="text-align: right">IPS</th> 138 + <th style="text-align: right">Average</th> 139 + <th style="text-align: right">Devitation</th> 140 + <th style="text-align: right">Median</th> 141 + <th style="text-align: right">99th&nbsp;%</th> 142 + </tr> 143 + 144 + <tr> 145 + <td style="white-space: nowrap">Pg Query Builder</td> 146 + <td style="white-space: nowrap; text-align: right">100.25 K</td> 147 + <td style="white-space: nowrap; text-align: right">9.97 μs</td> 148 + <td style="white-space: nowrap; text-align: right">±92.25%</td> 149 + <td style="white-space: nowrap; text-align: right">9.15 μs</td> 150 + <td style="white-space: nowrap; text-align: right">23.68 μs</td> 151 + </tr> 152 + 153 + <tr> 154 + <td style="white-space: nowrap">MyXQL Query Builder</td> 155 + <td style="white-space: nowrap; text-align: right">98.47 K</td> 156 + <td style="white-space: nowrap; text-align: right">10.16 μs</td> 157 + <td style="white-space: nowrap; text-align: right">±88.64%</td> 158 + <td style="white-space: nowrap; text-align: right">9.22 μs</td> 159 + <td style="white-space: nowrap; text-align: right">28.70 μs</td> 160 + </tr> 161 + 162 + <tr> 163 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 164 + <td style="white-space: nowrap; text-align: right">90.40 K</td> 165 + <td style="white-space: nowrap; text-align: right">11.06 μs</td> 166 + <td style="white-space: nowrap; text-align: right">±117.48%</td> 167 + <td style="white-space: nowrap; text-align: right">9.22 μs</td> 168 + <td style="white-space: nowrap; text-align: right">38.69 μs</td> 169 + </tr> 170 + 171 + </table> 172 + 173 + 174 + Comparison 175 + 176 + <table style="width: 1%"> 177 + <tr> 178 + <th>Name</th> 179 + <th style="text-align: right">IPS</th> 180 + <th style="text-align: right">Slower</th> 181 + <tr> 182 + <td style="white-space: nowrap">Pg Query Builder</td> 183 + <td style="white-space: nowrap;text-align: right">100.25 K</td> 184 + <td>&nbsp;</td> 185 + </tr> 186 + 187 + <tr> 188 + <td style="white-space: nowrap">MyXQL Query Builder</td> 189 + <td style="white-space: nowrap; text-align: right">98.47 K</td> 190 + <td style="white-space: nowrap; text-align: right">1.02x</td> 191 + </tr> 192 + 193 + <tr> 194 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 195 + <td style="white-space: nowrap; text-align: right">90.40 K</td> 196 + <td style="white-space: nowrap; text-align: right">1.11x</td> 197 + </tr> 198 + 199 + </table> 200 + 201 + 202 + 203 + <hr/> 204 + 205 + 206 + __Input: Fetch First Registry__ 207 + 208 + Run Time 209 + 210 + <table style="width: 1%"> 211 + <tr> 212 + <th>Name</th> 213 + <th style="text-align: right">IPS</th> 214 + <th style="text-align: right">Average</th> 215 + <th style="text-align: right">Devitation</th> 216 + <th style="text-align: right">Median</th> 217 + <th style="text-align: right">99th&nbsp;%</th> 218 + </tr> 219 + 220 + <tr> 221 + <td style="white-space: nowrap">Pg Query Builder</td> 222 + <td style="white-space: nowrap; text-align: right">173.31 K</td> 223 + <td style="white-space: nowrap; text-align: right">5.77 μs</td> 224 + <td style="white-space: nowrap; text-align: right">±389.85%</td> 225 + <td style="white-space: nowrap; text-align: right">4.47 μs</td> 226 + <td style="white-space: nowrap; text-align: right">20.18 μs</td> 227 + </tr> 228 + 229 + <tr> 230 + <td style="white-space: nowrap">MyXQL Query Builder</td> 231 + <td style="white-space: nowrap; text-align: right">173.06 K</td> 232 + <td style="white-space: nowrap; text-align: right">5.78 μs</td> 233 + <td style="white-space: nowrap; text-align: right">±411.02%</td> 234 + <td style="white-space: nowrap; text-align: right">4.82 μs</td> 235 + <td style="white-space: nowrap; text-align: right">16.20 μs</td> 236 + </tr> 237 + 238 + <tr> 239 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 240 + <td style="white-space: nowrap; text-align: right">167.17 K</td> 241 + <td style="white-space: nowrap; text-align: right">5.98 μs</td> 242 + <td style="white-space: nowrap; text-align: right">±420.59%</td> 243 + <td style="white-space: nowrap; text-align: right">4.82 μs</td> 244 + <td style="white-space: nowrap; text-align: right">19.42 μs</td> 245 + </tr> 246 + 247 + </table> 248 + 249 + 250 + Comparison 251 + 252 + <table style="width: 1%"> 253 + <tr> 254 + <th>Name</th> 255 + <th style="text-align: right">IPS</th> 256 + <th style="text-align: right">Slower</th> 257 + <tr> 258 + <td style="white-space: nowrap">Pg Query Builder</td> 259 + <td style="white-space: nowrap;text-align: right">173.31 K</td> 260 + <td>&nbsp;</td> 261 + </tr> 262 + 263 + <tr> 264 + <td style="white-space: nowrap">MyXQL Query Builder</td> 265 + <td style="white-space: nowrap; text-align: right">173.06 K</td> 266 + <td style="white-space: nowrap; text-align: right">1.0x</td> 267 + </tr> 268 + 269 + <tr> 270 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 271 + <td style="white-space: nowrap; text-align: right">167.17 K</td> 272 + <td style="white-space: nowrap; text-align: right">1.04x</td> 273 + </tr> 274 + 275 + </table> 276 + 277 + 278 + 279 + <hr/> 280 + 281 + 282 + __Input: Fetch Last Registry__ 283 + 284 + Run Time 285 + 286 + <table style="width: 1%"> 287 + <tr> 288 + <th>Name</th> 289 + <th style="text-align: right">IPS</th> 290 + <th style="text-align: right">Average</th> 291 + <th style="text-align: right">Devitation</th> 292 + <th style="text-align: right">Median</th> 293 + <th style="text-align: right">99th&nbsp;%</th> 294 + </tr> 295 + 296 + <tr> 297 + <td style="white-space: nowrap">Pg Query Builder</td> 298 + <td style="white-space: nowrap; text-align: right">177.36 K</td> 299 + <td style="white-space: nowrap; text-align: right">5.64 μs</td> 300 + <td style="white-space: nowrap; text-align: right">±446.37%</td> 301 + <td style="white-space: nowrap; text-align: right">4.47 μs</td> 302 + <td style="white-space: nowrap; text-align: right">17.67 μs</td> 303 + </tr> 304 + 305 + <tr> 306 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 307 + <td style="white-space: nowrap; text-align: right">169.74 K</td> 308 + <td style="white-space: nowrap; text-align: right">5.89 μs</td> 309 + <td style="white-space: nowrap; text-align: right">±394.73%</td> 310 + <td style="white-space: nowrap; text-align: right">4.82 μs</td> 311 + <td style="white-space: nowrap; text-align: right">18.16 μs</td> 312 + </tr> 313 + 314 + <tr> 315 + <td style="white-space: nowrap">MyXQL Query Builder</td> 316 + <td style="white-space: nowrap; text-align: right">162.83 K</td> 317 + <td style="white-space: nowrap; text-align: right">6.14 μs</td> 318 + <td style="white-space: nowrap; text-align: right">±383.32%</td> 319 + <td style="white-space: nowrap; text-align: right">4.82 μs</td> 320 + <td style="white-space: nowrap; text-align: right">22.14 μs</td> 321 + </tr> 322 + 323 + </table> 324 + 325 + 326 + Comparison 327 + 328 + <table style="width: 1%"> 329 + <tr> 330 + <th>Name</th> 331 + <th style="text-align: right">IPS</th> 332 + <th style="text-align: right">Slower</th> 333 + <tr> 334 + <td style="white-space: nowrap">Pg Query Builder</td> 335 + <td style="white-space: nowrap;text-align: right">177.36 K</td> 336 + <td>&nbsp;</td> 337 + </tr> 338 + 339 + <tr> 340 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 341 + <td style="white-space: nowrap; text-align: right">169.74 K</td> 342 + <td style="white-space: nowrap; text-align: right">1.04x</td> 343 + </tr> 344 + 345 + <tr> 346 + <td style="white-space: nowrap">MyXQL Query Builder</td> 347 + <td style="white-space: nowrap; text-align: right">162.83 K</td> 348 + <td style="white-space: nowrap; text-align: right">1.09x</td> 349 + </tr> 350 + 351 + </table> 352 + 353 + 354 + 355 + <hr/> 356 + 357 + 358 + __Input: Ordinary Delete All__ 359 + 360 + Run Time 361 + 362 + <table style="width: 1%"> 363 + <tr> 364 + <th>Name</th> 365 + <th style="text-align: right">IPS</th> 366 + <th style="text-align: right">Average</th> 367 + <th style="text-align: right">Devitation</th> 368 + <th style="text-align: right">Median</th> 369 + <th style="text-align: right">99th&nbsp;%</th> 370 + </tr> 371 + 372 + <tr> 373 + <td style="white-space: nowrap">Pg Query Builder</td> 374 + <td style="white-space: nowrap; text-align: right">335.81 K</td> 375 + <td style="white-space: nowrap; text-align: right">2.98 μs</td> 376 + <td style="white-space: nowrap; text-align: right">±775.40%</td> 377 + <td style="white-space: nowrap; text-align: right">2.03 μs</td> 378 + <td style="white-space: nowrap; text-align: right">9.43 μs</td> 379 + </tr> 380 + 381 + <tr> 382 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 383 + <td style="white-space: nowrap; text-align: right">325.92 K</td> 384 + <td style="white-space: nowrap; text-align: right">3.07 μs</td> 385 + <td style="white-space: nowrap; text-align: right">±948.36%</td> 386 + <td style="white-space: nowrap; text-align: right">2.02 μs</td> 387 + <td style="white-space: nowrap; text-align: right">8.31 μs</td> 388 + </tr> 389 + 390 + <tr> 391 + <td style="white-space: nowrap">MyXQL Query Builder</td> 392 + <td style="white-space: nowrap; text-align: right">301.67 K</td> 393 + <td style="white-space: nowrap; text-align: right">3.31 μs</td> 394 + <td style="white-space: nowrap; text-align: right">±832.06%</td> 395 + <td style="white-space: nowrap; text-align: right">2.03 μs</td> 396 + <td style="white-space: nowrap; text-align: right">11.59 μs</td> 397 + </tr> 398 + 399 + </table> 400 + 401 + 402 + Comparison 403 + 404 + <table style="width: 1%"> 405 + <tr> 406 + <th>Name</th> 407 + <th style="text-align: right">IPS</th> 408 + <th style="text-align: right">Slower</th> 409 + <tr> 410 + <td style="white-space: nowrap">Pg Query Builder</td> 411 + <td style="white-space: nowrap;text-align: right">335.81 K</td> 412 + <td>&nbsp;</td> 413 + </tr> 414 + 415 + <tr> 416 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 417 + <td style="white-space: nowrap; text-align: right">325.92 K</td> 418 + <td style="white-space: nowrap; text-align: right">1.03x</td> 419 + </tr> 420 + 421 + <tr> 422 + <td style="white-space: nowrap">MyXQL Query Builder</td> 423 + <td style="white-space: nowrap; text-align: right">301.67 K</td> 424 + <td style="white-space: nowrap; text-align: right">1.11x</td> 425 + </tr> 426 + 427 + </table> 428 + 429 + 430 + 431 + <hr/> 432 + 433 + 434 + __Input: Ordinary Order By__ 435 + 436 + Run Time 437 + 438 + <table style="width: 1%"> 439 + <tr> 440 + <th>Name</th> 441 + <th style="text-align: right">IPS</th> 442 + <th style="text-align: right">Average</th> 443 + <th style="text-align: right">Devitation</th> 444 + <th style="text-align: right">Median</th> 445 + <th style="text-align: right">99th&nbsp;%</th> 446 + </tr> 447 + 448 + <tr> 449 + <td style="white-space: nowrap">Pg Query Builder</td> 450 + <td style="white-space: nowrap; text-align: right">186.48 K</td> 451 + <td style="white-space: nowrap; text-align: right">5.36 μs</td> 452 + <td style="white-space: nowrap; text-align: right">±400.39%</td> 453 + <td style="white-space: nowrap; text-align: right">4.40 μs</td> 454 + <td style="white-space: nowrap; text-align: right">17.81 μs</td> 455 + </tr> 456 + 457 + <tr> 458 + <td style="white-space: nowrap">MyXQL Query Builder</td> 459 + <td style="white-space: nowrap; text-align: right">182.02 K</td> 460 + <td style="white-space: nowrap; text-align: right">5.49 μs</td> 461 + <td style="white-space: nowrap; text-align: right">±402.64%</td> 462 + <td style="white-space: nowrap; text-align: right">4.40 μs</td> 463 + <td style="white-space: nowrap; text-align: right">17.39 μs</td> 464 + </tr> 465 + 466 + <tr> 467 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 468 + <td style="white-space: nowrap; text-align: right">172.19 K</td> 469 + <td style="white-space: nowrap; text-align: right">5.81 μs</td> 470 + <td style="white-space: nowrap; text-align: right">±427.38%</td> 471 + <td style="white-space: nowrap; text-align: right">4.47 μs</td> 472 + <td style="white-space: nowrap; text-align: right">21.44 μs</td> 473 + </tr> 474 + 475 + </table> 476 + 477 + 478 + Comparison 479 + 480 + <table style="width: 1%"> 481 + <tr> 482 + <th>Name</th> 483 + <th style="text-align: right">IPS</th> 484 + <th style="text-align: right">Slower</th> 485 + <tr> 486 + <td style="white-space: nowrap">Pg Query Builder</td> 487 + <td style="white-space: nowrap;text-align: right">186.48 K</td> 488 + <td>&nbsp;</td> 489 + </tr> 490 + 491 + <tr> 492 + <td style="white-space: nowrap">MyXQL Query Builder</td> 493 + <td style="white-space: nowrap; text-align: right">182.02 K</td> 494 + <td style="white-space: nowrap; text-align: right">1.02x</td> 495 + </tr> 496 + 497 + <tr> 498 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 499 + <td style="white-space: nowrap; text-align: right">172.19 K</td> 500 + <td style="white-space: nowrap; text-align: right">1.08x</td> 501 + </tr> 502 + 503 + </table> 504 + 505 + 506 + 507 + <hr/> 508 + 509 + 510 + __Input: Ordinary Select All__ 511 + 512 + Run Time 513 + 514 + <table style="width: 1%"> 515 + <tr> 516 + <th>Name</th> 517 + <th style="text-align: right">IPS</th> 518 + <th style="text-align: right">Average</th> 519 + <th style="text-align: right">Devitation</th> 520 + <th style="text-align: right">Median</th> 521 + <th style="text-align: right">99th&nbsp;%</th> 522 + </tr> 523 + 524 + <tr> 525 + <td style="white-space: nowrap">Pg Query Builder</td> 526 + <td style="white-space: nowrap; text-align: right">200.19 K</td> 527 + <td style="white-space: nowrap; text-align: right">5.00 μs</td> 528 + <td style="white-space: nowrap; text-align: right">±657.77%</td> 529 + <td style="white-space: nowrap; text-align: right">3.49 μs</td> 530 + <td style="white-space: nowrap; text-align: right">14.88 μs</td> 531 + </tr> 532 + 533 + <tr> 534 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 535 + <td style="white-space: nowrap; text-align: right">199.77 K</td> 536 + <td style="white-space: nowrap; text-align: right">5.01 μs</td> 537 + <td style="white-space: nowrap; text-align: right">±698.35%</td> 538 + <td style="white-space: nowrap; text-align: right">3.49 μs</td> 539 + <td style="white-space: nowrap; text-align: right">13.90 μs</td> 540 + </tr> 541 + 542 + <tr> 543 + <td style="white-space: nowrap">MyXQL Query Builder</td> 544 + <td style="white-space: nowrap; text-align: right">191.70 K</td> 545 + <td style="white-space: nowrap; text-align: right">5.22 μs</td> 546 + <td style="white-space: nowrap; text-align: right">±601.95%</td> 547 + <td style="white-space: nowrap; text-align: right">3.56 μs</td> 548 + <td style="white-space: nowrap; text-align: right">16.06 μs</td> 549 + </tr> 550 + 551 + </table> 552 + 553 + 554 + Comparison 555 + 556 + <table style="width: 1%"> 557 + <tr> 558 + <th>Name</th> 559 + <th style="text-align: right">IPS</th> 560 + <th style="text-align: right">Slower</th> 561 + <tr> 562 + <td style="white-space: nowrap">Pg Query Builder</td> 563 + <td style="white-space: nowrap;text-align: right">200.19 K</td> 564 + <td>&nbsp;</td> 565 + </tr> 566 + 567 + <tr> 568 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 569 + <td style="white-space: nowrap; text-align: right">199.77 K</td> 570 + <td style="white-space: nowrap; text-align: right">1.0x</td> 571 + </tr> 572 + 573 + <tr> 574 + <td style="white-space: nowrap">MyXQL Query Builder</td> 575 + <td style="white-space: nowrap; text-align: right">191.70 K</td> 576 + <td style="white-space: nowrap; text-align: right">1.04x</td> 577 + </tr> 578 + 579 + </table> 580 + 581 + 582 + 583 + <hr/> 584 + 585 + 586 + __Input: Ordinary Update All__ 587 + 588 + Run Time 589 + 590 + <table style="width: 1%"> 591 + <tr> 592 + <th>Name</th> 593 + <th style="text-align: right">IPS</th> 594 + <th style="text-align: right">Average</th> 595 + <th style="text-align: right">Devitation</th> 596 + <th style="text-align: right">Median</th> 597 + <th style="text-align: right">99th&nbsp;%</th> 598 + </tr> 599 + 600 + <tr> 601 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 602 + <td style="white-space: nowrap; text-align: right">263.35 K</td> 603 + <td style="white-space: nowrap; text-align: right">3.80 μs</td> 604 + <td style="white-space: nowrap; text-align: right">±1304.70%</td> 605 + <td style="white-space: nowrap; text-align: right">2.86 μs</td> 606 + <td style="white-space: nowrap; text-align: right">10.13 μs</td> 607 + </tr> 608 + 609 + <tr> 610 + <td style="white-space: nowrap">MyXQL Query Builder</td> 611 + <td style="white-space: nowrap; text-align: right">260.96 K</td> 612 + <td style="white-space: nowrap; text-align: right">3.83 μs</td> 613 + <td style="white-space: nowrap; text-align: right">±760.59%</td> 614 + <td style="white-space: nowrap; text-align: right">2.86 μs</td> 615 + <td style="white-space: nowrap; text-align: right">10.20 μs</td> 616 + </tr> 617 + 618 + <tr> 619 + <td style="white-space: nowrap">Pg Query Builder</td> 620 + <td style="white-space: nowrap; text-align: right">249.05 K</td> 621 + <td style="white-space: nowrap; text-align: right">4.02 μs</td> 622 + <td style="white-space: nowrap; text-align: right">±827.04%</td> 623 + <td style="white-space: nowrap; text-align: right">2.86 μs</td> 624 + <td style="white-space: nowrap; text-align: right">12.99 μs</td> 625 + </tr> 626 + 627 + </table> 628 + 629 + 630 + Comparison 631 + 632 + <table style="width: 1%"> 633 + <tr> 634 + <th>Name</th> 635 + <th style="text-align: right">IPS</th> 636 + <th style="text-align: right">Slower</th> 637 + <tr> 638 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 639 + <td style="white-space: nowrap;text-align: right">263.35 K</td> 640 + <td>&nbsp;</td> 641 + </tr> 642 + 643 + <tr> 644 + <td style="white-space: nowrap">MyXQL Query Builder</td> 645 + <td style="white-space: nowrap; text-align: right">260.96 K</td> 646 + <td style="white-space: nowrap; text-align: right">1.01x</td> 647 + </tr> 648 + 649 + <tr> 650 + <td style="white-space: nowrap">Pg Query Builder</td> 651 + <td style="white-space: nowrap; text-align: right">249.05 K</td> 652 + <td style="white-space: nowrap; text-align: right">1.06x</td> 653 + </tr> 654 + 655 + </table> 656 + 657 + 658 + 659 + <hr/> 660 + 661 + 662 + __Input: Ordinary Where__ 663 + 664 + Run Time 665 + 666 + <table style="width: 1%"> 667 + <tr> 668 + <th>Name</th> 669 + <th style="text-align: right">IPS</th> 670 + <th style="text-align: right">Average</th> 671 + <th style="text-align: right">Devitation</th> 672 + <th style="text-align: right">Median</th> 673 + <th style="text-align: right">99th&nbsp;%</th> 674 + </tr> 675 + 676 + <tr> 677 + <td style="white-space: nowrap">MyXQL Query Builder</td> 678 + <td style="white-space: nowrap; text-align: right">162.26 K</td> 679 + <td style="white-space: nowrap; text-align: right">6.16 μs</td> 680 + <td style="white-space: nowrap; text-align: right">±343.86%</td> 681 + <td style="white-space: nowrap; text-align: right">5.31 μs</td> 682 + <td style="white-space: nowrap; text-align: right">17.74 μs</td> 683 + </tr> 684 + 685 + <tr> 686 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 687 + <td style="white-space: nowrap; text-align: right">159.31 K</td> 688 + <td style="white-space: nowrap; text-align: right">6.28 μs</td> 689 + <td style="white-space: nowrap; text-align: right">±305.50%</td> 690 + <td style="white-space: nowrap; text-align: right">5.38 μs</td> 691 + <td style="white-space: nowrap; text-align: right">19.35 μs</td> 692 + </tr> 693 + 694 + <tr> 695 + <td style="white-space: nowrap">Pg Query Builder</td> 696 + <td style="white-space: nowrap; text-align: right">154.28 K</td> 697 + <td style="white-space: nowrap; text-align: right">6.48 μs</td> 698 + <td style="white-space: nowrap; text-align: right">±355.38%</td> 699 + <td style="white-space: nowrap; text-align: right">5.45 μs</td> 700 + <td style="white-space: nowrap; text-align: right">20.04 μs</td> 701 + </tr> 702 + 703 + </table> 704 + 705 + 706 + Comparison 707 + 708 + <table style="width: 1%"> 709 + <tr> 710 + <th>Name</th> 711 + <th style="text-align: right">IPS</th> 712 + <th style="text-align: right">Slower</th> 713 + <tr> 714 + <td style="white-space: nowrap">MyXQL Query Builder</td> 715 + <td style="white-space: nowrap;text-align: right">162.26 K</td> 716 + <td>&nbsp;</td> 717 + </tr> 718 + 719 + <tr> 720 + <td style="white-space: nowrap">SQLite3 Query Builder</td> 721 + <td style="white-space: nowrap; text-align: right">159.31 K</td> 722 + <td style="white-space: nowrap; text-align: right">1.02x</td> 723 + </tr> 724 + 725 + <tr> 726 + <td style="white-space: nowrap">Pg Query Builder</td> 727 + <td style="white-space: nowrap; text-align: right">154.28 K</td> 728 + <td style="white-space: nowrap; text-align: right">1.05x</td> 729 + </tr> 730 + 731 + </table> 732 + 733 + 734 + 735 + <hr/> 736 +
+8 -4
bench/scripts/macro/all_bench.exs
··· 20 20 21 21 alias Ecto.Bench.User 22 22 23 - limit = 5_000 23 + limit = 1_000 24 24 25 25 users = 26 26 1..limit 27 27 |> Enum.map(fn _ -> User.sample_data() end) 28 28 29 29 # We need to insert data to fetch 30 + Ecto.Bench.SQLite3Repo.insert_all(User, users) 30 31 Ecto.Bench.PgRepo.insert_all(User, users) 31 32 Ecto.Bench.MyXQLRepo.insert_all(User, users) 32 33 33 34 jobs = %{ 35 + "SQLite3 Repo.all/2" => fn -> Ecto.Bench.SQLite3Repo.all(User, limit: limit) end, 34 36 "Pg Repo.all/2" => fn -> Ecto.Bench.PgRepo.all(User, limit: limit) end, 35 37 "MyXQL Repo.all/2" => fn -> Ecto.Bench.MyXQLRepo.all(User, limit: limit) end 36 38 } 37 39 38 40 path = System.get_env("BENCHMARKS_OUTPUT_PATH") || "bench/results" 39 - file = Path.join(path, "all.json") 40 41 41 42 Benchee.run( 42 43 jobs, 43 - formatters: [Benchee.Formatters.JSON, Benchee.Formatters.Console], 44 - formatter_options: [json: [file: file]], 44 + formatters: [ 45 + Benchee.Formatters.Console, 46 + {Benchee.Formatters.Markdown, file: Path.join(path, "all.md")} 47 + ], 45 48 time: 10, 46 49 after_each: fn results -> 47 50 ^limit = length(results) ··· 49 52 ) 50 53 51 54 # Clean inserted data 55 + Ecto.Bench.SQLite3Repo.delete_all(User) 52 56 Ecto.Bench.PgRepo.delete_all(User) 53 57 Ecto.Bench.MyXQLRepo.delete_all(User)
+6 -5
bench/scripts/macro/insert_bench.exs
··· 25 25 } 26 26 27 27 jobs = %{ 28 - "Exqlite Insert" => fn entry -> Ecto.Bench.ExqliteRepo.insert!(entry) end, 28 + "SQLite3 Insert" => fn entry -> Ecto.Bench.SQLite3Repo.insert!(entry) end, 29 29 "Pg Insert" => fn entry -> Ecto.Bench.PgRepo.insert!(entry) end, 30 30 "MyXQL Insert" => fn entry -> Ecto.Bench.MyXQLRepo.insert!(entry) end 31 31 } 32 32 33 33 path = System.get_env("BENCHMARKS_OUTPUT_PATH") || "bench/results" 34 - file = Path.join(path, "insert.json") 35 34 36 35 Benchee.run( 37 36 jobs, 38 37 inputs: inputs, 39 - formatters: [Benchee.Formatters.JSON, Benchee.Formatters.Console], 40 - formatter_options: [json: [file: file]] 38 + formatters: [ 39 + Benchee.Formatters.Console, 40 + {Benchee.Formatters.Markdown, file: Path.join(path, "insert.md")} 41 + ] 41 42 ) 42 43 43 44 # Clean inserted data 44 - Ecto.Bench.ExqliteRepo.delete_all(User) 45 + Ecto.Bench.SQLite3Repo.delete_all(User) 45 46 Ecto.Bench.PgRepo.delete_all(User) 46 47 Ecto.Bench.MyXQLRepo.delete_all(User)
+12 -7
bench/scripts/micro/load_bench.exs
··· 30 30 1..1_000_000 |> Enum.map(fn _ -> %{name: "Alice", email: "email@email.com"} end), 31 31 "Time attr" => 32 32 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", time_attr: ~T[21:25:04.361140]} end), 33 - "Date attr" => 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", date_attr: ~D[2018-06-20]} end), 34 - "NaiveDateTime attr" => 35 - 1..100_000 36 - |> Enum.map(fn _ -> %{name: "Alice", naive_datetime_attr: ~N[2019-06-20 21:32:07.424178]} end), 33 + "Date attr" => 34 + 1..100_000 |> Enum.map(fn _ -> %{name: "Alice", date_attr: ~D[2018-06-20]} end), 35 + # "NaiveDateTime attr" => 36 + # 1..100_000 37 + # |> Enum.map(fn _ -> %{name: "Alice", naive_datetime_attr: ~N[2019-06-20 21:32:07.424178]} end), 37 38 "UUID attr" => 38 39 1..100_000 39 40 |> Enum.map(fn _ -> %{name: "Alice", uuid: Ecto.UUID.bingenerate()} end) 40 41 } 41 42 42 43 jobs = %{ 44 + "SQLite3 Loader" => fn data -> 45 + Enum.map(data, &Ecto.Bench.SQLite3Repo.load(User, &1)) 46 + end, 43 47 "Pg Loader" => fn data -> Enum.map(data, &Ecto.Bench.PgRepo.load(User, &1)) end, 44 48 "MyXQL Loader" => fn data -> Enum.map(data, &Ecto.Bench.MyXQLRepo.load(User, &1)) end 45 49 } 46 50 47 51 path = System.get_env("BENCHMARKS_OUTPUT_PATH") || "bench/results" 48 - file = Path.join(path, "load.json") 49 52 50 53 Benchee.run( 51 54 jobs, 52 55 inputs: inputs, 53 - formatters: [Benchee.Formatters.JSON, Benchee.Formatters.Console], 54 - formatter_options: [json: [file: file]] 56 + formatters: [ 57 + Benchee.Formatters.Console, 58 + {Benchee.Formatters.Markdown, file: Path.join(path, "load.md")} 59 + ] 55 60 )
+10 -4
bench/scripts/micro/to_sql_bench.exs
··· 49 49 } 50 50 51 51 jobs = %{ 52 + "SQLite3 Query Builder" => fn {type, query} -> 53 + Ecto.Bench.SQLite3Repo.to_sql(type, query) 54 + end, 52 55 "Pg Query Builder" => fn {type, query} -> Ecto.Bench.PgRepo.to_sql(type, query) end, 53 - "MyXQL Query Builder" => fn {type, query} -> Ecto.Bench.MyXQLRepo.to_sql(type, query) end 56 + "MyXQL Query Builder" => fn {type, query} -> 57 + Ecto.Bench.MyXQLRepo.to_sql(type, query) 58 + end 54 59 } 55 60 56 61 path = System.get_env("BENCHMARKS_OUTPUT_PATH") || "bench/results" 57 - file = Path.join(path, "to_sql.json") 58 62 59 63 Benchee.run( 60 64 jobs, 61 65 inputs: inputs, 62 - formatters: [Benchee.Formatters.JSON, Benchee.Formatters.Console], 63 - formatter_options: [json: [file: file]] 66 + formatters: [ 67 + Benchee.Formatters.Console, 68 + {Benchee.Formatters.Markdown, file: Path.join(path, "to_sql.md")} 69 + ] 64 70 )
+5 -5
bench/support/repo.exs
··· 20 20 21 21 Application.put_env( 22 22 :ecto_sql, 23 - Ecto.Bench.ExqliteRepo, 24 - adapter: Ecto.Adapters.Exqlite, 25 - database: "/tmp/exqlite_bench.db", 23 + Ecto.Bench.SQLite3Repo, 24 + adapter: Ecto.Adapters.SQLite3, 25 + database: "/tmp/SQLite3_bench.db", 26 26 journal_mode: :wal, 27 27 cache_size: -64000, 28 28 temp_store: :memory, ··· 38 38 use Ecto.Repo, otp_app: :ecto_sql, adapter: Ecto.Adapters.MyXQL, log: false 39 39 end 40 40 41 - defmodule Ecto.Bench.ExqliteRepo do 42 - use Ecto.Repo, otp_app: :ecto_sql, adapter: Ecto.Adapters.Exqlite, log: false 41 + defmodule Ecto.Bench.SQLite3Repo do 42 + use Ecto.Repo, otp_app: :ecto_sql, adapter: Ecto.Adapters.SQLite3, log: false 43 43 end
+6 -6
bench/support/setup.exs
··· 2 2 Code.require_file("migrations.exs", __DIR__) 3 3 Code.require_file("schemas.exs", __DIR__) 4 4 5 - alias Ecto.Bench.{PgRepo, MyXQLRepo, ExqliteRepo, CreateUser} 5 + alias Ecto.Bench.{PgRepo, MyXQLRepo, SQLite3Repo, CreateUser} 6 6 7 7 {:ok, _} = Ecto.Adapters.Postgres.ensure_all_started(PgRepo.config(), :temporary) 8 8 {:ok, _} = Ecto.Adapters.MyXQL.ensure_all_started(MyXQLRepo.config(), :temporary) 9 - {:ok, _} = Ecto.Adapters.Exqlite.ensure_all_started(ExqliteRepo.config(), :temporary) 9 + {:ok, _} = Ecto.Adapters.SQLite3.ensure_all_started(SQLite3Repo.config(), :temporary) 10 10 11 11 _ = Ecto.Adapters.Postgres.storage_down(PgRepo.config()) 12 12 :ok = Ecto.Adapters.Postgres.storage_up(PgRepo.config()) ··· 14 14 _ = Ecto.Adapters.MyXQL.storage_down(MyXQLRepo.config()) 15 15 :ok = Ecto.Adapters.MyXQL.storage_up(MyXQLRepo.config()) 16 16 17 - _ = Ecto.Adapters.Exqlite.storage_down(ExqliteRepo.config()) 18 - :ok = Ecto.Adapters.Exqlite.storage_up(ExqliteRepo.config()) 17 + _ = Ecto.Adapters.SQLite3.storage_down(SQLite3Repo.config()) 18 + :ok = Ecto.Adapters.SQLite3.storage_up(SQLite3Repo.config()) 19 19 20 20 {:ok, _pid} = PgRepo.start_link(log: false) 21 21 {:ok, _pid} = MyXQLRepo.start_link(log: false) 22 - {:ok, _pid} = ExqliteRepo.start_link(log: false) 22 + {:ok, _pid} = SQLite3Repo.start_link(log: false) 23 23 24 24 :ok = Ecto.Migrator.up(PgRepo, 0, CreateUser, log: false) 25 25 :ok = Ecto.Migrator.up(MyXQLRepo, 0, CreateUser, log: false) 26 - :ok = Ecto.Migrator.up(ExqliteRepo, 0, CreateUser, log: false) 26 + :ok = Ecto.Migrator.up(SQLite3Repo, 0, CreateUser, log: false)
+3 -3
mix.exs
··· 36 36 {:ecto, "~> 3.5"}, 37 37 {:exqlite, "~> 0.5"}, 38 38 {:ex_doc, "~> 0.23.0", only: [:dev], runtime: false}, 39 - {:jason, ">= 0.0.0", only: [:test, :docs]}, 39 + {:jason, ">= 0.0.0", only: [:bench, :test, :docs]}, 40 40 {:temp, "~> 0.4", only: [:test]}, 41 41 42 42 # Benchmarks 43 - {:benchee, "~> 0.11.0", only: :bench}, 44 - {:benchee_json, "~> 0.4.0", only: :bench}, 43 + {:benchee, "~> 1.0", only: :bench}, 44 + {:benchee_markdown, "~> 0.2", only: :bench}, 45 45 {:postgrex, "~> 0.15.0", only: :bench}, 46 46 {:myxql, "~> 0.4.0", only: :bench} 47 47 ]
+3 -4
mix.lock
··· 1 1 %{ 2 - "benchee": {:hex, :benchee, "0.11.0", "cf96e328ff5d69838dd89c21a9db22716bfcc6ef772e9d9dddf7ba622102722d", [:mix], [{:deep_merge, "~> 0.1", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "c345e090e0a61bf33e0385aa3ad394fcb7d863e313bc3fca522e390c7f39166e"}, 3 - "benchee_json": {:hex, :benchee_json, "0.4.0", "59d3277829bd1dca8373cdb20b916cb435c2647be235d09963fc0959db908c36", [:mix], [{:benchee, "~> 0.10", [hex: :benchee, repo: "hexpm", optional: false]}, {:poison, ">= 1.4.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "71a3edb6a30708de2a01368aa8f288e1c0ed7897b125adc396ce7c2c7245b1e7"}, 2 + "benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"}, 3 + "benchee_markdown": {:hex, :benchee_markdown, "0.2.6", "52fe95c8a4a744e5127264c3cb72db70f2adcc05113139e0a0b69b4df9e95ada", [:mix], [{:benchee, ">= 0.99.0 and < 2.0.0", [hex: :benchee, repo: "hexpm", optional: false]}], "hexpm", "0c2cb871befab33ab79ab204391400983c3a3aad55a3c0e2f0aac31a8b445ca4"}, 4 4 "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, 5 5 "db_connection": {:hex, :db_connection, "2.3.1", "4c9f3ed1ef37471cbdd2762d6655be11e38193904d9c5c1c9389f1b891a3088e", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "abaab61780dde30301d840417890bd9f74131041afd02174cf4e10635b3a63f5"}, 6 6 "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, 7 - "deep_merge": {:hex, :deep_merge, "0.2.0", "c1050fa2edf4848b9f556fba1b75afc66608a4219659e3311d9c9427b5b680b3", [:mix], [], "hexpm", "e3bf435a54ed27b0ba3a01eb117ae017988804e136edcbe8a6a14c310daa966e"}, 7 + "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, 8 8 "earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"}, 9 9 "ecto": {:hex, :ecto, "3.5.8", "8ebf12be6016cb99313348ba7bb4612f4114b9a506d6da79a2adc7ef449340bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ea0be182ea8922eb7742e3ae8e71b67ee00ae177de1bf76210299a5f16ba4c77"}, 10 10 "ecto_sql": {:hex, :ecto_sql, "3.5.4", "a9e292c40bd79fff88885f95f1ecd7b2516e09aa99c7dd0201aa84c54d2358e4", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.5.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1fff1a28a898d7bbef263f1f3ea425b04ba9f33816d843238c84eff883347343"}, ··· 16 16 "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, 17 17 "myxql": {:hex, :myxql, "0.4.5", "49784e6a3e4fc33088cc9004948ef255ee698b0d7b533fb1fa453cc99a3f9972", [:mix], [{:db_connection, "~> 2.0", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:geo, "~> 3.3", [hex: :geo, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "40a6166ab0a54f44a6e2c437aed6360ce51ce7f779557ae30d1cc4c4b4e7ad13"}, 18 18 "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, 19 - "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, 20 19 "postgrex": {:hex, :postgrex, "0.15.8", "f5e782bbe5e8fa178d5e3cd1999c857dc48eda95f0a4d7f7bd92a50e84a0d491", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "698fbfacea34c4cf22c8281abeb5cf68d99628d541874f085520ab3b53d356fe"}, 21 20 "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, 22 21 "temp": {:hex, :temp, "0.4.7", "2c78482cc2294020a4bc0c95950b907ff386523367d4e63308a252feffbea9f2", [:mix], [], "hexpm", "6af19e7d6a85a427478be1021574d1ae2a1e1b90882586f06bde76c63cd03e0d"},