lean4-htt/src/Lean/Util/Profile.lean
Sebastian Ullrich d988849ce3
doc: profiler
2024-04-03 17:53:36 +02:00

50 lines
1.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2019 Sebastian Ullrich. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Sebastian Ullrich
-/
prelude
import Init.Data.OfScientific
import Lean.Data.Options
namespace Lean
register_builtin_option profiler : Bool := {
defValue := false
group := "profiler"
descr := "show exclusive execution times of various Lean components
See also `trace.profiler` for an alternative profiling system with structured output."
}
register_builtin_option profiler.threshold : Nat := {
defValue := 100
group := "profiler"
descr := "threshold in milliseconds, profiling times under threshold will not be reported individually"
}
@[export lean_get_profiler]
private def get_profiler (o : Options) : Bool :=
profiler.get o
@[export lean_get_profiler_threshold]
def profiler.threshold.getSecs (o : Options) : Float :=
(profiler.threshold.get o).toFloat / 1000
/-- Print and accumulate run time of `act` when option `profiler` is set to `true`. -/
@[extern "lean_profileit"]
def profileit {α : Type} (category : @& String) (opts : @& Options) (fn : Unit → α) (decl := Name.anonymous) : α := fn ()
unsafe def profileitIOUnsafe {ε α : Type} (category : String) (opts : Options) (act : EIO ε α) (decl := Name.anonymous) : EIO ε α :=
match profileit (decl := decl) category opts fun _ => unsafeEIO act with
| Except.ok a => pure a
| Except.error e => throw e
@[implemented_by profileitIOUnsafe]
def profileitIO {ε α : Type} (category : String) (opts : Options) (act : EIO ε α) (decl := Name.anonymous) : EIO ε α := act
-- impossible to infer `ε`
def profileitM {m : Type → Type} (ε : Type) [MonadFunctorT (EIO ε) m] {α : Type} (category : String) (opts : Options) (act : m α) (decl := Name.anonymous) : m α :=
monadMap (fun {β} => profileitIO (ε := ε) (α := β) (decl := decl) category opts) act
end Lean