diff --git a/lib/benchee/conversion/count.ex b/lib/benchee/conversion/count.ex index 8fab7afb..76184405 100644 --- a/lib/benchee/conversion/count.ex +++ b/lib/benchee/conversion/count.ex @@ -13,30 +13,30 @@ defmodule Benchee.Conversion.Count do @one_thousand 1_000 @units %{ - billion: %Unit{ - name: :billion, - magnitude: @one_billion, - label: "B", - long: "Billion" - }, - million: %Unit{ - name: :million, - magnitude: @one_million, - label: "M", - long: "Million" - }, + billion: %Unit{ + name: :billion, + magnitude: @one_billion, + label: "B", + long: "Billion" + }, + million: %Unit{ + name: :million, + magnitude: @one_million, + label: "M", + long: "Million" + }, thousand: %Unit{ - name: :thousand, - magnitude: @one_thousand, - label: "K", - long: "Thousand" - }, - one: %Unit{ - name: :one, - magnitude: 1, - label: "", - long: "" - }, + name: :thousand, + magnitude: @one_thousand, + label: "K", + long: "Thousand" + }, + one: %Unit{ + name: :one, + magnitude: 1, + label: "", + long: "" + } } @doc """ @@ -60,12 +60,15 @@ defmodule Benchee.Conversion.Count do def scale(count) when count >= @one_billion do scale_with_unit(count, :billion) end + def scale(count) when count >= @one_million do scale_with_unit(count, :million) end + def scale(count) when count >= @one_thousand do scale_with_unit(count, :thousand) end + def scale(count) do scale_with_unit(count, :one) end @@ -103,7 +106,7 @@ defmodule Benchee.Conversion.Count do } """ def unit_for(unit) do - Scale.unit_for @units, unit + Scale.unit_for(@units, unit) end @doc """ @@ -125,7 +128,7 @@ defmodule Benchee.Conversion.Count do """ def scale(count, unit) do - Scale.scale count, unit, __MODULE__ + Scale.scale(count, unit, __MODULE__) end @doc """ @@ -140,7 +143,7 @@ defmodule Benchee.Conversion.Count do :million """ def convert(number_and_unit, desired_unit) do - Scale.convert number_and_unit, desired_unit, __MODULE__ + Scale.convert(number_and_unit, desired_unit, __MODULE__) end @doc """ @@ -166,6 +169,7 @@ defmodule Benchee.Conversion.Count do """ def best(list, opts \\ [strategy: :best]) + def best(list, opts) do Scale.best_unit(list, __MODULE__, opts) end diff --git a/lib/benchee/conversion/deviation_percent.ex b/lib/benchee/conversion/deviation_percent.ex index 1955c882..ebd12108 100644 --- a/lib/benchee/conversion/deviation_percent.ex +++ b/lib/benchee/conversion/deviation_percent.ex @@ -1,5 +1,4 @@ defmodule Benchee.Conversion.DeviationPercent do - @moduledoc """ Helps with formattiong for the standard deviation ratio converting it into the more common percent form. diff --git a/lib/benchee/conversion/duration.ex b/lib/benchee/conversion/duration.ex index fb07ce56..41177146 100644 --- a/lib/benchee/conversion/duration.ex +++ b/lib/benchee/conversion/duration.ex @@ -15,48 +15,47 @@ defmodule Benchee.Conversion.Duration do @minutes_per_hour 60 @nanoseconds_per_millisecond @nanoseconds_per_microsecond * @microseconds_per_millisecond - @nanoseconds_per_second @nanoseconds_per_millisecond * - @milliseconds_per_second + @nanoseconds_per_second @nanoseconds_per_millisecond * @milliseconds_per_second @nanoseconds_per_minute @nanoseconds_per_second * @seconds_per_minute @nanoseconds_per_hour @nanoseconds_per_minute * @minutes_per_hour @units %{ - hour: %Unit{ - name: :hour, - magnitude: @nanoseconds_per_hour, - label: "h", - long: "Hours" - }, - minute: %Unit{ - name: :minute, - magnitude: @nanoseconds_per_minute, - label: "min", - long: "Minutes" - }, - second: %Unit{ - name: :second, - magnitude: @nanoseconds_per_second, - label: "s", - long: "Seconds" - }, + hour: %Unit{ + name: :hour, + magnitude: @nanoseconds_per_hour, + label: "h", + long: "Hours" + }, + minute: %Unit{ + name: :minute, + magnitude: @nanoseconds_per_minute, + label: "min", + long: "Minutes" + }, + second: %Unit{ + name: :second, + magnitude: @nanoseconds_per_second, + label: "s", + long: "Seconds" + }, millisecond: %Unit{ - name: :millisecond, - magnitude: @nanoseconds_per_millisecond, - label: "ms", - long: "Milliseconds" - }, + name: :millisecond, + magnitude: @nanoseconds_per_millisecond, + label: "ms", + long: "Milliseconds" + }, microsecond: %Unit{ - name: :microsecond, - magnitude: @nanoseconds_per_microsecond, - label: "μs", - long: "Microseconds" - }, - nanosecond: %Unit{ - name: :nanosecond, - magnitude: 1, - label: "ns", - long: "Nanoseconds" - } + name: :microsecond, + magnitude: @nanoseconds_per_microsecond, + label: "μs", + long: "Microseconds" + }, + nanosecond: %Unit{ + name: :nanosecond, + magnitude: 1, + label: "ns", + long: "Nanoseconds" + } } @doc """ @@ -83,22 +82,27 @@ defmodule Benchee.Conversion.Duration do :hour """ def scale(duration) when duration >= @nanoseconds_per_hour do - scale_with_unit duration, :hour + scale_with_unit(duration, :hour) end + def scale(duration) when duration >= @nanoseconds_per_minute do - scale_with_unit duration, :minute + scale_with_unit(duration, :minute) end + def scale(duration) when duration >= @nanoseconds_per_second do - scale_with_unit duration, :second + scale_with_unit(duration, :second) end + def scale(duration) when duration >= @nanoseconds_per_millisecond do - scale_with_unit duration, :millisecond + scale_with_unit(duration, :millisecond) end + def scale(duration) when duration >= @nanoseconds_per_microsecond do - scale_with_unit duration, :microsecond + scale_with_unit(duration, :microsecond) end + def scale(duration) do - scale_with_unit duration, :nanosecond + scale_with_unit(duration, :nanosecond) end # Helper function for returning a tuple of {value, unit} @@ -134,7 +138,7 @@ defmodule Benchee.Conversion.Duration do } """ def unit_for(unit) do - Scale.unit_for @units, unit + Scale.unit_for(@units, unit) end @doc """ @@ -153,7 +157,7 @@ defmodule Benchee.Conversion.Duration do """ def scale(count, unit) do - Scale.scale count, unit, __MODULE__ + Scale.scale(count, unit, __MODULE__) end @doc """ @@ -168,7 +172,7 @@ defmodule Benchee.Conversion.Duration do :hour """ def convert(number_and_unit, desired_unit) do - Scale.convert number_and_unit, desired_unit, __MODULE__ + Scale.convert(number_and_unit, desired_unit, __MODULE__) end @doc """ @@ -215,6 +219,7 @@ defmodule Benchee.Conversion.Duration do :second """ def best(list, opts \\ [strategy: :best]) + def best(list, opts) do Scale.best_unit(list, __MODULE__, opts) end diff --git a/lib/benchee/conversion/format.ex b/lib/benchee/conversion/format.ex index 469b93df..d2050e67 100644 --- a/lib/benchee/conversion/format.ex +++ b/lib/benchee/conversion/format.ex @@ -12,7 +12,7 @@ defmodule Benchee.Conversion.Format do Formats a number as a string, with a unit label. See `Benchee.Conversion.Count` and `Benchee.Conversion.Duration` for examples """ - @callback format(number) :: String.t + @callback format(number) :: String.t() # Generic formatting functions @@ -44,6 +44,7 @@ defmodule Benchee.Conversion.Format do def format({count, unit = %Unit{}}, module) do format(count, label(unit), separator(module)) end + def format({count, unit_atom}, module) do format({count, module.unit_for(unit_atom)}, module) end diff --git a/lib/benchee/conversion/memory.ex b/lib/benchee/conversion/memory.ex index 31374834..a8c59c28 100644 --- a/lib/benchee/conversion/memory.ex +++ b/lib/benchee/conversion/memory.ex @@ -15,39 +15,39 @@ defmodule Benchee.Conversion.Memory do @units %{ terabyte: %Unit{ - name: :terabyte, - magnitude: @bytes_per_terabyte, - label: "TB", - long: "Terabytes" - }, + name: :terabyte, + magnitude: @bytes_per_terabyte, + label: "TB", + long: "Terabytes" + }, gigabyte: %Unit{ - name: :gigabyte, - magnitude: @bytes_per_gigabyte, - label: "GB", - long: "Gigabytes" - }, + name: :gigabyte, + magnitude: @bytes_per_gigabyte, + label: "GB", + long: "Gigabytes" + }, megabyte: %Unit{ - name: :megabyte, - magnitude: @bytes_per_megabyte, - label: "MB", - long: "Megabytes" - }, + name: :megabyte, + magnitude: @bytes_per_megabyte, + label: "MB", + long: "Megabytes" + }, kilobyte: %Unit{ - name: :kilobyte, - magnitude: @bytes_per_kilobyte, - label: "KB", - long: "Kilobytes" - }, - byte: %Unit{ - name: :byte, - magnitude: 1, - label: "B", - long: "Bytes" - } + name: :kilobyte, + magnitude: @bytes_per_kilobyte, + label: "KB", + long: "Kilobytes" + }, + byte: %Unit{ + name: :byte, + magnitude: 1, + label: "B", + long: "Bytes" + } } @type unit_atom :: :byte | :kilobyte | :megabyte | :gigabyte | :terabyte - @type any_unit :: unit_atom | Unit.t + @type any_unit :: unit_atom | Unit.t() @doc """ Converts a value for a specified %Unit or unit atom and converts it to the equivalent of another unit of measure. @@ -67,9 +67,9 @@ defmodule Benchee.Conversion.Memory do iex> unit.name :megabyte """ - @spec convert({number, any_unit}, any_unit) :: Scale.scaled_number + @spec convert({number, any_unit}, any_unit) :: Scale.scaled_number() def convert(number_and_unit, desired_unit) do - Scale.convert number_and_unit, desired_unit, __MODULE__ + Scale.convert(number_and_unit, desired_unit, __MODULE__) end # Scaling functions @@ -104,25 +104,30 @@ defmodule Benchee.Conversion.Memory do :terabyte """ def scale(memory) when memory >= @bytes_per_terabyte do - scale_with_unit memory, :terabyte + scale_with_unit(memory, :terabyte) end + def scale(memory) when memory >= @bytes_per_gigabyte do - scale_with_unit memory, :gigabyte + scale_with_unit(memory, :gigabyte) end + def scale(memory) when memory >= @bytes_per_megabyte do - scale_with_unit memory, :megabyte + scale_with_unit(memory, :megabyte) end + def scale(memory) when memory >= @bytes_per_kilobyte do - scale_with_unit memory, :kilobyte + scale_with_unit(memory, :kilobyte) end + def scale(memory) do - scale_with_unit memory, :byte + scale_with_unit(memory, :byte) end # Helper function for returning a tuple of {value, unit} defp scale_with_unit(nil, _) do {nil, nil} end + defp scale_with_unit(memory, unit) do {scale(memory, unit), unit_for(unit)} end @@ -155,7 +160,7 @@ defmodule Benchee.Conversion.Memory do } """ def unit_for(unit) do - Scale.unit_for @units, unit + Scale.unit_for(@units, unit) end @doc """ @@ -174,7 +179,7 @@ defmodule Benchee.Conversion.Memory do """ def scale(count, unit) do - Scale.scale count, unit, __MODULE__ + Scale.scale(count, unit, __MODULE__) end @doc """ @@ -201,6 +206,7 @@ defmodule Benchee.Conversion.Memory do :megabyte """ def best(list, opts \\ [strategy: :best]) + def best(list, opts) do Scale.best_unit(list, __MODULE__, opts) end diff --git a/lib/benchee/conversion/scale.ex b/lib/benchee/conversion/scale.ex index d86d5f44..df21fd08 100644 --- a/lib/benchee/conversion/scale.ex +++ b/lib/benchee/conversion/scale.ex @@ -8,7 +8,7 @@ defmodule Benchee.Conversion.Scale do alias Benchee.Conversion.Unit - @type unit :: Unit.t + @type unit :: Unit.t() @type unit_atom :: atom @type any_unit :: unit | unit_atom @type scaled_number :: {number, unit} @@ -67,8 +67,9 @@ defmodule Benchee.Conversion.Scale do def scale(value, unit = %Unit{}, _module) do scale(value, unit) end + def scale(value, unit_atom, module) do - scale value, module.unit_for(unit_atom) + scale(value, module.unit_for(unit_atom)) end @doc """ @@ -89,7 +90,7 @@ defmodule Benchee.Conversion.Scale do units. Used by `Benchee.Conversion.Duration` and `Benchee.Conversion.Count`. """ def unit_for(_units, unit = %Unit{}), do: unit - def unit_for(units, unit), do: Map.fetch! units, unit + def unit_for(units, unit), do: Map.fetch!(units, unit) @doc """ Used internally to implement scaling in the modules without duplication. @@ -100,8 +101,10 @@ defmodule Benchee.Conversion.Scale do do_convert({value, current_unit}, desired_unit) end - defp do_convert({value, %Unit{magnitude: current_magnitude}}, - desired_unit = %Unit{magnitude: desired_magnitude}) do + defp do_convert( + {value, %Unit{magnitude: current_magnitude}}, + desired_unit = %Unit{magnitude: desired_magnitude} + ) do multiplier = current_magnitude / desired_magnitude {value * multiplier, desired_unit} end @@ -164,10 +167,10 @@ defmodule Benchee.Conversion.Scale do defp do_best_unit(list, module, opts) do case Keyword.get(opts, :strategy, :best) do - :best -> best_unit(list, module) - :largest -> largest_unit(list, module) + :best -> best_unit(list, module) + :largest -> largest_unit(list, module) :smallest -> smallest_unit(list, module) - :none -> module.base_unit + :none -> module.base_unit end end @@ -212,6 +215,7 @@ defmodule Benchee.Conversion.Scale do defp by_frequency_and_magnitude({unit_a, frequency}, {unit_b, frequency}) do magnitude(unit_a) > magnitude(unit_b) end + defp by_frequency_and_magnitude({_, frequency_a}, {_, frequency_b}) do frequency_a > frequency_b end diff --git a/lib/benchee/conversion/unit.ex b/lib/benchee/conversion/unit.ex index 3ccac5ca..361fbb36 100644 --- a/lib/benchee/conversion/unit.ex +++ b/lib/benchee/conversion/unit.ex @@ -13,9 +13,11 @@ defmodule Benchee.Conversion.Unit do """ defstruct [:name, :magnitude, :label, :long] - @type t :: %Benchee.Conversion.Unit{name: atom, - magnitude: non_neg_integer, - label: String.t, - long: String.t} + @type t :: %Benchee.Conversion.Unit{ + name: atom, + magnitude: non_neg_integer, + label: String.t(), + long: String.t() + } end diff --git a/lib/benchee/formatters/console.ex b/lib/benchee/formatters/console.ex index 23bb05ec..12d2c7b2 100644 --- a/lib/benchee/formatters/console.ex +++ b/lib/benchee/formatters/console.ex @@ -101,9 +101,8 @@ defmodule Benchee.Formatters.Console do defp generate_output(scenarios, config, input) do [ - input_header(input) | - RunTime.format_scenarios(scenarios, config) ++ - Memory.format_scenarios(scenarios, config) + input_header(input) + | RunTime.format_scenarios(scenarios, config) ++ Memory.format_scenarios(scenarios, config) ] end diff --git a/lib/benchee/formatters/console/memory.ex b/lib/benchee/formatters/console/memory.ex index cfbbb239..244f2b06 100644 --- a/lib/benchee/formatters/console/memory.ex +++ b/lib/benchee/formatters/console/memory.ex @@ -71,6 +71,7 @@ defmodule Benchee.Formatters.Console.Memory do end defp column_descriptors(label_width, hide_statistics) + defp column_descriptors(label_width, false) do "\n~*s~*s~*s~*s~*s\n" |> :io_lib.format([ @@ -101,6 +102,7 @@ defmodule Benchee.Formatters.Console.Memory do @spec scenario_reports([Scenario.t()], unit_per_statistic, integer, boolean) :: [String.t()] defp scenario_reports(scenarios, units, label_width, hide_statistics) + defp scenario_reports([scenario | other_scenarios], units, label_width, true) do [ reference_report(scenario, units, label_width), @@ -124,11 +126,12 @@ defmodule Benchee.Formatters.Console.Memory do scenario = %Scenario{memory_usage_statistics: %{sample_size: 0}}, _, label_width, - _) do - - warning = "WARNING the scenario \"#{scenario.name}\" has no memory measurements!" <> - " This is probably a bug please report it!\n" <> - "https://github.com/PragTob/benchee/issues/new" + _ + ) do + warning = + "WARNING the scenario \"#{scenario.name}\" has no memory measurements!" <> + " This is probably a bug please report it!\n" <> + "https://github.com/PragTob/benchee/issues/new" data = "~*ts~*ts\n" @@ -234,10 +237,11 @@ defmodule Benchee.Formatters.Console.Memory do end defp calculate_slower_value(job_median, reference_median) - when job_median == 0 or is_nil(job_median) or reference_median == 0 or - is_nil(reference_median) do + when job_median == 0 or is_nil(job_median) or reference_median == 0 or + is_nil(reference_median) do @na end + defp calculate_slower_value(job_median, reference_median) do job_median / reference_median end diff --git a/lib/benchee/formatters/console/run_time.ex b/lib/benchee/formatters/console/run_time.ex index d83781f2..80f6da50 100644 --- a/lib/benchee/formatters/console/run_time.ex +++ b/lib/benchee/formatters/console/run_time.ex @@ -235,11 +235,7 @@ defmodule Benchee.Formatters.Console.RunTime do } = scenario "~*s~*s\n" - |> :io_lib.format([ - -label_width, - name, - @ips_width, - Helpers.count_output(ips, ips_unit)]) + |> :io_lib.format([-label_width, name, @ips_width, Helpers.count_output(ips, ips_unit)]) |> to_string end