Skip to content
This repository has been archived by the owner on Nov 3, 2020. It is now read-only.

Add benchmarking code for Encoder #1

Merged
merged 7 commits into from
Jul 14, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,99 @@ saxy.stream 0.189 - 1.31x slower
erlsom.stream 0.160 - 1.54x slower
erlsom.binary 0.133 - 1.86x slower
```

## Encoding

### `mix bench.encode.simple`

```
Operating System: macOS
CPU Information: Intel(R) Core(TM) i7-6567U CPU @ 3.30GHz
Number of Available Cores: 4
Available memory: 16 GB
Elixir 1.6.5
Erlang 20.3.4
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
parallel: 1
inputs: none specified
Estimated total run time: 14 s


Benchmarking saxy...
Benchmarking xml_builder...

Name ips average deviation median 99th %
saxy 14.39 K 69.48 μs ±17.57% 66 μs 118 μs
xml_builder 3.46 K 288.71 μs ±13.61% 278 μs 450 μs

Comparison:
saxy 14.39 K
xml_builder 3.46 K - 4.16x slower
```

### `mix bench.encode.nested`

```
Generated saxy_bench app
Operating System: macOS
CPU Information: Intel(R) Core(TM) i7-6567U CPU @ 3.30GHz
Number of Available Cores: 4
Available memory: 16 GB
Elixir 1.6.5
Erlang 20.3.4
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
parallel: 1
inputs: none specified
Estimated total run time: 21 s


Benchmarking saxy...
Benchmarking xml_builder indented...
Benchmarking xml_builder no format...

Name ips average deviation median 99th %
saxy 278.59 3.59 ms ±11.67% 3.51 ms 5.42 ms
xml_builder no format 14.09 70.97 ms ±8.57% 69.40 ms 95.40 ms
xml_builder indented 0.36 2790.85 ms ±0.18% 2790.85 ms 2795.99 ms

Comparison:
saxy 278.59
xml_builder no format 14.09 - 19.77x slower
xml_builder indented 0.36 - 777.51x slower
```

### `mix bench.encode.long`

```
Operating System: macOS
CPU Information: Intel(R) Core(TM) i7-6567U CPU @ 3.30GHz
Number of Available Cores: 4
Available memory: 16 GB
Elixir 1.6.5
Erlang 20.3.4
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
parallel: 1
inputs: none specified
Estimated total run time: 21 s


Benchmarking saxy...
Benchmarking xml_builder indented...
Benchmarking xml_builder no format...

Name ips average deviation median 99th %
saxy 1138.55 0.88 ms ±29.18% 0.81 ms 2.00 ms
xml_builder no format 659.89 1.52 ms ±5.37% 1.47 ms 1.84 ms
xml_builder indented 651.91 1.53 ms ±7.56% 1.48 ms 2.03 ms

Comparison:
saxy 1138.55
xml_builder no format 659.89 - 1.73x slower
xml_builder indented 651.91 - 1.75x slower
```
34 changes: 34 additions & 0 deletions lib/mix/tasks/bench.encode.long.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
defmodule Mix.Tasks.Bench.Encode.Long do
use Mix.Task

def run(_args) do
long_content = String.duplicate("1234567890 &abcdefẩ<>\"", 1000)

Benchee.run(%{
"saxy" => fn ->
saxy_document = Saxy.XML.element(
"root",
[],
Saxy.XML.element("data", [], long_content)
)
Saxy.encode!(saxy_document)
end,
"xml_builder no format" => fn ->
xml_builder_document =
XmlBuilder.document(
"root",
[XmlBuilder.element("data", long_content)]
)
XmlBuilder.generate(xml_builder_document, format: :none)
end,
"xml_builder indented" => fn ->
xml_builder_document =
XmlBuilder.document(
"root",
[XmlBuilder.element("data", long_content)]
)
XmlBuilder.generate(xml_builder_document)
end
}, time: 5)
end
end
35 changes: 35 additions & 0 deletions lib/mix/tasks/bench.encode.nested.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
defmodule Mix.Tasks.Bench.Encode.Nested do
use Mix.Task

def run(_args) do
Benchee.run(%{
"saxy" => fn ->
saxy_document =
Enum.reduce(1000..1, "Finally we have some content", fn index, acc ->
Saxy.XML.element("level#{index}", [], acc)
end)
Saxy.encode!(saxy_document)
end,
"xml_builder no format" => fn ->
xml_builder_document =
XmlBuilder.document(
"level1",
Enum.reduce(1000..2, "Finally we have some content", fn index, acc ->
[XmlBuilder.element("level#{index}", acc)]
end)
)
XmlBuilder.generate(xml_builder_document, format: :none)
end,
"xml_builder indented" => fn ->
xml_builder_document =
XmlBuilder.document(
"level1",
Enum.reduce(1000..2, "Finally we have some content", fn index, acc ->
[XmlBuilder.element("level#{index}", acc)]
end)
)
XmlBuilder.generate(xml_builder_document)
end
}, time: 5)
end
end
43 changes: 43 additions & 0 deletions lib/mix/tasks/bench.encode.simple.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
defmodule Mix.Tasks.Bench.Encode.Simple do
use Mix.Task

def run(_args) do
Benchee.run(%{
"saxy" => fn ->
saxy_document =
Saxy.XML.element("root", [], [
Saxy.XML.element("element1", [], []),
Saxy.XML.element("element2", [], [
Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
Saxy.XML.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &amp;"}, []),
Saxy.XML.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &amp;"}, []),
Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], [])
]),
Saxy.XML.element("element3", [], []),
])
Saxy.encode!(saxy_document)
end,
"xml_builder" => fn ->
xml_builder_document =
XmlBuilder.document("root", [], [
XmlBuilder.element("element1", [], []),
XmlBuilder.element("element2", [], [
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
XmlBuilder.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &amp;"}, []),
XmlBuilder.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &amp;"}, []),
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], []),
XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &amp;"], [])
]),
XmlBuilder.element("element3", [], []),
])
XmlBuilder.generate(xml_builder_document, format: :none)
end
}, time: 5)
end
end
1 change: 1 addition & 0 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ defmodule SaxyBench.MixProject do
[
{:saxy, github: "qcam/saxy"},
{:erlsom, "~> 1.4"},
{:xml_builder, "~> 2.0"},
{:benchee, ">= 0.0.0"}
]
end
Expand Down
3 changes: 2 additions & 1 deletion mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
"benchee": {:hex, :benchee, "0.12.1", "1286a79bab2f1899220134daf9a695586af00ea71968e6cd89d3d3afdf7cecba", [:mix], [{:deep_merge, "~> 0.1", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm"},
"deep_merge": {:hex, :deep_merge, "0.1.1", "c27866a7524a337b6a039eeb8dd4f17d458fd40fbbcb8c54661b71a22fffe846", [:mix], [], "hexpm"},
"erlsom": {:hex, :erlsom, "1.4.1", "53dbacf35adfea6f0714fd0e4a7b0720d495e88c5e24e12c5dc88c7b62bd3e49", [:rebar3], [], "hexpm"},
"saxy": {:git, "https://github.com/qcam/saxy.git", "998d0156de3cbbf5ada09260572ea8c15e10f948", []},
"saxy": {:git, "https://github.com/qcam/saxy.git", "7266632e9407842f28ffac254c56dc41210a5690", []},
"xml_builder": {:hex, :xml_builder, "2.1.0", "c249d5339427c13cae11e9d9d0e8b40d25d228b9ecc54029f24017385e60280b", [:mix], [], "hexpm"},
}