From 021ba37b16fda95369530faf8951d165251586df Mon Sep 17 00:00:00 2001 From: Devon Estes Date: Wed, 21 Mar 2018 13:29:53 +0100 Subject: [PATCH] Add extended stats for memory usage Now if folks want to see the extended info for memory usage, they can! It still won't show if there is no variation in the measurements. --- lib/benchee/formatters/console/memory.ex | 69 ++++++++++++++++++- .../formatters/console/memory_test.exs | 40 +++++++++++ .../file_creation_integration_test.exs | 5 ++ 3 files changed, 113 insertions(+), 1 deletion(-) diff --git a/lib/benchee/formatters/console/memory.ex b/lib/benchee/formatters/console/memory.ex index 540f027e..1761e17d 100644 --- a/lib/benchee/formatters/console/memory.ex +++ b/lib/benchee/formatters/console/memory.ex @@ -11,6 +11,7 @@ defmodule Benchee.Formatters.Console.Memory do Benchmark.Scenario, Conversion, Conversion.Unit, + Conversion.Count, Formatters.Console.Helpers } @@ -21,6 +22,10 @@ defmodule Benchee.Formatters.Console.Memory do @deviation_width 11 @median_width 15 @percentile_width 15 + @minimum_width 15 + @maximum_width 15 + @sample_size_width 15 + @mode_width 25 @doc """ Formats the memory statistics to a report suitable for output on the CLI. If @@ -39,7 +44,8 @@ defmodule Benchee.Formatters.Console.Memory do "\nMemory usage statistics:\n", column_descriptors(label_width, hide_statistics), scenario_reports(scenarios, units, label_width, hide_statistics), - comparison_report(scenarios, units, label_width, config, hide_statistics) + comparison_report(scenarios, units, label_width, config, hide_statistics), + extended_statistics_report(scenarios, units, label_width, config, hide_statistics) ]) end @@ -204,4 +210,65 @@ defmodule Benchee.Formatters.Console.Memory do |> :io_lib.format([-label_width, name, @median_width, median_format, slower]) |> to_string end + + defp extended_statistics_report(_, _, _, %{extended_statistics: false}, _), do: [] + defp extended_statistics_report(_, _, _, _, true), do: [] + + defp extended_statistics_report(scenarios, units, label_width, _config, _hide_statistics) do + [ + Helpers.descriptor("Extended statistics"), + extended_column_descriptors(label_width) + | extended_statistics(scenarios, units, label_width) + ] + end + + defp extended_column_descriptors(label_width) do + "\n~*s~*s~*s~*s~*s\n" + |> :io_lib.format([ + -label_width, + "Name", + @minimum_width, + "minimum", + @maximum_width, + "maximum", + @sample_size_width, + "sample size", + @mode_width, + "mode" + ]) + |> to_string + end + + defp extended_statistics(scenarios, units, label_width) do + Enum.map(scenarios, fn scenario -> + format_scenario_extended(scenario, units, label_width) + end) + end + + defp format_scenario_extended(scenario, %{memory: memory_unit}, label_width) do + %Scenario{ + name: name, + memory_usage_statistics: %Statistics{ + minimum: minimum, + maximum: maximum, + sample_size: sample_size, + mode: mode + } + } = scenario + + "~*s~*ts~*ts~*ts~*ts\n" + |> :io_lib.format([ + -label_width, + name, + @minimum_width, + Helpers.count_output(minimum, memory_unit), + @maximum_width, + Helpers.count_output(maximum, memory_unit), + @sample_size_width, + Count.format(sample_size), + @mode_width, + Helpers.mode_out(mode, memory_unit) + ]) + |> to_string + end end diff --git a/test/benchee/formatters/console/memory_test.exs b/test/benchee/formatters/console/memory_test.exs index 19fb537e..1edd7ec7 100644 --- a/test/benchee/formatters/console/memory_test.exs +++ b/test/benchee/formatters/console/memory_test.exs @@ -241,6 +241,46 @@ defmodule Benchee.Formatters.Console.MemoryTest do refute Regex.match?(~r/Comparison/i, output) refute Regex.match?(~r/average/i, output) end + + test "displays extended statistics" do + scenarios = [ + %Scenario{ + name: "First job", + memory_usage_statistics: %Statistics{ + average: 200.0, + ips: 5_000.0, + std_dev_ratio: 0.1, + median: 195.5, + percentiles: %{99 => 300.1}, + minimum: 111.1, + maximum: 333.3, + mode: 201.2, + sample_size: 50_000 + }, + run_time_statistics: %Statistics{average: 100.0, ips: 1_000.0} + } + ] + + params = %{ + comparison: true, + unit_scaling: :best, + extended_statistics: true + } + + output = Memory.format_scenarios(scenarios, params) + [_memory_title, _header1, _result1, title, header2, result2] = output + + assert title =~ ~r/Extended statistics: / + assert header2 =~ ~r/minimum/ + assert header2 =~ ~r/maximum/ + assert header2 =~ ~r/sample size/ + assert header2 =~ ~r/mode/ + assert result2 =~ ~r/First job/ + assert result2 =~ ~r/111.10/ + assert result2 =~ ~r/333.30/ + assert result2 =~ ~r/50 K/ + assert result2 =~ ~r/201.20/ + end end defp assert_column_width(name, string, expected_width) do diff --git a/test/benchee/utility/file_creation_integration_test.exs b/test/benchee/utility/file_creation_integration_test.exs index dc34d7e5..a0633a5c 100644 --- a/test/benchee/utility/file_creation_integration_test.exs +++ b/test/benchee/utility/file_creation_integration_test.exs @@ -21,6 +21,7 @@ defmodule Benchee.Utility.FileCreationIntegrationTest do assert_correct_files() after File.rm_rf! @directory + File.rm_rf! "testing" end end @@ -30,6 +31,7 @@ defmodule Benchee.Utility.FileCreationIntegrationTest do assert_correct_files() after File.rm_rf! @directory + File.rm_rf! "testing" end end @@ -41,6 +43,7 @@ defmodule Benchee.Utility.FileCreationIntegrationTest do assert output =~ @file_name_2 after File.rm_rf! @directory + File.rm_rf! "testing" end end @@ -52,6 +55,7 @@ defmodule Benchee.Utility.FileCreationIntegrationTest do assert File.exists? "#{@directory}/test_string_length_1.txt" after File.rm_rf! @directory + File.rm_rf! "testing" end defp assert_correct_files do @@ -76,6 +80,7 @@ defmodule Benchee.Utility.FileCreationIntegrationTest do assert Enum.member?(file_names, @file_name_2) after File.rm_rf! @directory + File.rm_rf! "testing" end end end