 
   defp profile_and_analyse(fun, opts) do
     if Keyword.get(opts, :warmup, true) do
-      IO.puts "Warmup...\n"
+      IO.puts("Warmup...\n")
       fun.()
     end
 

  defp format_total(total_time, total_count) do
    time_per_call = :erlang.float_to_binary(divide(total_time, total_count), [{:decimals, 2}])

    ["Total", Integer.to_string(total_count), "100.00", Integer.to_string(total_time), time_per_call]
  end

  defp divide(_, 0), do: 0.0

  `Mix.Tasks.Profile.Cprof` that uses `:cprof` and has a low performance degradation effect.
  """

  @switches [
    parallel: :boolean,
    require: :keep,
    eval: :keep,
    config: :keep,
    matching: :string,
    halt: :boolean,
    compile: :boolean,
    deps_check: :boolean,
    calls: :integer,
    time: :integer,
    sort: :string,
    start: :boolean,
    archives_check: :boolean,
    warmup: :boolean,
    elixir_version_check: :boolean,
    parallel_require: :keep
  ]

  @aliases [
    r: :require, 
    p: :parallel, 
    e: :eval, 
    c: :config
  ]

  def run(args) do
    {opts, head} = OptionParser.parse_head!(args, aliases: @aliases, strict: @switches)

    Mix.Tasks.Run.run(
      ["--no-mix-exs" | args],
      opts,
      head,
      &profile_code(&1, opts),
      &profile_code(File.read!(&1), opts)
    )
  end

  defp profile_code(code_string, opts) do
    content =
      quote do
        unquote(__MODULE__).profile(
          fn ->
            unquote(Code.string_to_quoted!(code_string))
          end,
          unquote(opts)
        )
      end

    # Use compile_quoted since it leaves less noise than eval_quoted
    Code.compile_quoted(content)
  end
