diff --git a/README.md b/README.md index 00b4f3d..1c80f10 100644 --- a/README.md +++ b/README.md @@ -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 +``` diff --git a/lib/mix/tasks/bench.encode.long.ex b/lib/mix/tasks/bench.encode.long.ex new file mode 100644 index 0000000..66580e4 --- /dev/null +++ b/lib/mix/tasks/bench.encode.long.ex @@ -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 diff --git a/lib/mix/tasks/bench.encode.nested.ex b/lib/mix/tasks/bench.encode.nested.ex new file mode 100644 index 0000000..cf5782e --- /dev/null +++ b/lib/mix/tasks/bench.encode.nested.ex @@ -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 diff --git a/lib/mix/tasks/bench.encode.simple.ex b/lib/mix/tasks/bench.encode.simple.ex new file mode 100644 index 0000000..6219b41 --- /dev/null +++ b/lib/mix/tasks/bench.encode.simple.ex @@ -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 &"], []), + Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + Saxy.XML.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &"}, []), + Saxy.XML.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &"}, []), + Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + Saxy.XML.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []) + ]), + 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 &"], []), + XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + XmlBuilder.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &"}, []), + XmlBuilder.element("element2x", %{a: "aaa", b: "bbb", c: "ccc &"}, []), + XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []), + XmlBuilder.element("element2x", [a: "aaa", b: "bbb", c: "ccc &"], []) + ]), + XmlBuilder.element("element3", [], []), + ]) + XmlBuilder.generate(xml_builder_document, format: :none) + end + }, time: 5) + end +end diff --git a/mix.exs b/mix.exs index 53ec5e6..029dc35 100644 --- a/mix.exs +++ b/mix.exs @@ -23,6 +23,7 @@ defmodule SaxyBench.MixProject do [ {:saxy, github: "qcam/saxy"}, {:erlsom, "~> 1.4"}, + {:xml_builder, "~> 2.0"}, {:benchee, ">= 0.0.0"} ] end diff --git a/mix.lock b/mix.lock index b0f9e09..b6fdc4f 100644 --- a/mix.lock +++ b/mix.lock @@ -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"}, }