sig
  module Test :
    sig
      type t = Bench.Test.t
      val create : name:string -> ?key:int -> (unit -> unit) -> t
      val create_indexed :
        name:string ->
        args:int list ->
        ?key:int -> (int -> (unit -> unit) Core.Std.Staged.t) -> t
      val create_group : name:string -> t list -> t
    end
  module Variable :
    sig
      type t =
          [ `Compactions
          | `Cycles
          | `Major_allocated
          | `Major_collections
          | `Minor_allocated
          | `Minor_collections
          | `Nanos
          | `One
          | `Promoted
          | `Runs ]
      val t_of_sexp : Sexplib.Sexp.t -> t
      val __t_of_sexp__ : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  module Run_config :
    sig
      type t = Bench.Run_config.t
      val create :
        ?verbosity:[ `High | `Low ] ->
        ?no_compactions:bool ->
        ?time_quota:Core.Std.Time.Span.t ->
        ?sampling_type:[ `Geometric of float | `Linear of int ] ->
        ?stabilize_gc_between_runs:bool ->
        ?fork_each_benchmark:bool -> unit -> t
    end
  module Display_config :
    sig
      type t = Bench.Display_config.t
      val create :
        ?don't_display_table:bool ->
        ?limit_width_to:int ->
        ?display:Textutils.Ascii_table.Display.t ->
        ?ascii_table:bool ->
        ?show_absolute_ci:bool ->
        ?show_percentage:bool ->
        ?show_speedup:bool ->
        ?show_samples:bool ->
        ?show_all_values:bool -> ?show_overheads:bool -> unit -> t
    end
  module Analysis_config :
    sig
      type t = Bench.Analysis_config.t
      val create :
        responder:Variable.t ->
        predictors:Variable.t list ->
        ?bootstrap_trials:int ->
        ?r_square:bool -> ?regression_name:string -> unit -> t
      val with_error_estimation : ?bootstrap_trials:int -> t -> t
      val nanos_vs_runs : t
      val cycles_vs_runs : t
      val nanos : predictors:Variable.t list -> t
      val cycles : predictors:Variable.t list -> t
      val allocations_vs_runs : t list
      val gc_vs_runs : t list
      val default : t list
    end
  module Measurement :
    sig
      type t = Bench.Measurement.t
      val name : t -> string
      val save : t -> filename:string -> unit
      val load : filename:string -> t
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  val make_command : Test.t list -> Core.Std.Command.t
  val bench :
    ?run_config:Run_config.t ->
    ?analysis_configs:Analysis_config.t list ->
    ?display_config:Display_config.t -> Test.t list -> unit
  val measure : ?run_config:Run_config.t -> Test.t list -> Measurement.t list
  val analyze :
    ?analysis_configs:Analysis_config.t list ->
    Measurement.t -> Analysis_result.t Core.Std.Or_error.t
  val display :
    ?display_config:Display_config.t -> Analysis_result.t list -> unit
  val make_command_ext :
    summary:string ->
    extra_spec:('a, unit -> unit) Core.Std.Command.Spec.t ->
    f:(Analysis_config.t list * Display_config.t *
       [ `From_file of string list
       | `Run of (Measurement.t -> string) option * Run_config.t ] -> 'a) ->
    Core.Std.Command.t
end