Skip to content

Commit c18fe03

Browse files
authored
pkg: add argument to pkg lock to print perf stats (ocaml#11263)
Signed-off-by: Stephen Sherratt <[email protected]>
1 parent e356e05 commit c18fe03

File tree

5 files changed

+62
-15
lines changed

5 files changed

+62
-15
lines changed

bin/lock_dev_tool.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ let solve ~dev_tool ~local_packages =
8181
~solver_env_from_current_system
8282
~version_preference:None
8383
~lock_dirs:[ lock_dir ]
84+
~print_perf_stats:false
8485
;;
8586

8687
let compiler_package_name = Package_name.of_string "ocaml"

bin/pkg/lock.ml

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ let solve_lock_dir
7070
workspace
7171
~local_packages
7272
~project_pins
73+
~print_perf_stats
7374
version_preference
7475
solver_env_from_current_system
7576
lock_dir_path
@@ -94,6 +95,7 @@ let solve_lock_dir
9495
~unset_solver_vars_from_context:
9596
(unset_solver_vars_of_workspace workspace ~lock_dir_path)
9697
in
98+
let time_start = Unix.gettimeofday () in
9799
let* repos =
98100
let repo_map = repositories_of_workspace workspace in
99101
let repo_names =
@@ -105,6 +107,7 @@ let solve_lock_dir
105107
get_repos repo_map ~repositories:(repositories_of_lock_dir workspace ~lock_dir_path)
106108
in
107109
let* pins = resolve_project_pins project_pins in
110+
let time_solve_start = Unix.gettimeofday () in
108111
progress_state := Some Progress_indicator.Per_lockdir.State.Solving;
109112
Dune_pkg.Opam_solver.solve_lock_dir
110113
solver_env
@@ -119,19 +122,30 @@ let solve_lock_dir
119122
~constraints:(constraints_of_workspace workspace ~lock_dir_path)
120123
>>= function
121124
| Error (`Diagnostic_message message) -> Fiber.return (Error (lock_dir_path, message))
122-
| Ok { lock_dir; files; pinned_packages } ->
125+
| Ok { lock_dir; files; pinned_packages; num_expanded_packages } ->
126+
let time_end = Unix.gettimeofday () in
127+
let maybe_perf_stats =
128+
if print_perf_stats
129+
then
130+
[ Pp.nop
131+
; Pp.textf "Expanded packages: %d" num_expanded_packages
132+
; Pp.textf "Updated repos in: %.2fs" (time_solve_start -. time_start)
133+
; Pp.textf "Solved dependencies in: %.2fs" (time_end -. time_solve_start)
134+
]
135+
else []
136+
in
123137
let summary_message =
124138
User_message.make
125-
[ Pp.tag
126-
User_message.Style.Success
127-
(Pp.textf
128-
"Solution for %s:"
129-
(Path.Source.to_string_maybe_quoted lock_dir_path))
130-
; (match Package_name.Map.values lock_dir.packages with
131-
| [] ->
132-
Pp.tag User_message.Style.Warning @@ Pp.text "(no dependencies to lock)"
133-
| packages -> pp_packages packages)
134-
]
139+
(Pp.tag
140+
User_message.Style.Success
141+
(Pp.textf
142+
"Solution for %s:"
143+
(Path.Source.to_string_maybe_quoted lock_dir_path))
144+
:: (match Package_name.Map.values lock_dir.packages with
145+
| [] ->
146+
Pp.tag User_message.Style.Warning @@ Pp.text "(no dependencies to lock)"
147+
| packages -> pp_packages packages)
148+
:: maybe_perf_stats)
135149
in
136150
progress_state := None;
137151
let+ lock_dir = Lock_dir.compute_missing_checksums ~pinned_packages lock_dir in
@@ -145,6 +159,7 @@ let solve
145159
~solver_env_from_current_system
146160
~version_preference
147161
~lock_dirs
162+
~print_perf_stats
148163
=
149164
let open Fiber.O in
150165
(* a list of thunks that will perform all the file IO side
@@ -166,6 +181,7 @@ let solve
166181
workspace
167182
~local_packages
168183
~project_pins
184+
~print_perf_stats
169185
version_preference
170186
solver_env_from_current_system
171187
lockdir_path
@@ -198,7 +214,7 @@ let project_pins =
198214
Pin_stanza.DB.combine_exn acc (Dune_project.pins project))
199215
;;
200216

201-
let lock ~version_preference ~lock_dirs_arg =
217+
let lock ~version_preference ~lock_dirs_arg ~print_perf_stats =
202218
let open Fiber.O in
203219
let* solver_env_from_current_system =
204220
Dune_pkg.Sys_poll.make ~path:(Env_path.path Stdune.Env.initial)
@@ -223,15 +239,18 @@ let lock ~version_preference ~lock_dirs_arg =
223239
~solver_env_from_current_system
224240
~version_preference
225241
~lock_dirs
242+
~print_perf_stats
226243
;;
227244

228245
let term =
229246
let+ builder = Common.Builder.term
230247
and+ version_preference = Version_preference.term
231-
and+ lock_dirs_arg = Pkg_common.Lock_dirs_arg.term in
248+
and+ lock_dirs_arg = Pkg_common.Lock_dirs_arg.term
249+
and+ print_perf_stats = Arg.(value & flag & info [ "print-perf-stats" ]) in
232250
let builder = Common.Builder.forbid_builds builder in
233251
let common, config = Common.init builder in
234-
Scheduler.go ~common ~config (fun () -> lock ~version_preference ~lock_dirs_arg)
252+
Scheduler.go ~common ~config (fun () ->
253+
lock ~version_preference ~lock_dirs_arg ~print_perf_stats)
235254
;;
236255

237256
let info =

bin/pkg/lock.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ val solve
77
-> solver_env_from_current_system:Dune_pkg.Solver_env.t option
88
-> version_preference:Dune_pkg.Version_preference.t option
99
-> lock_dirs:Path.Source.t list
10+
-> print_perf_stats:bool
1011
-> unit Fiber.t
1112

1213
(** Command to create lock directory *)

src/dune_pkg/opam_solver.ml

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ module Context = struct
7878
packages for which we've printed a warning. *)
7979
available_cache : (OpamPackage.t, bool) Table.t
8080
; constraints : OpamTypes.filtered_formula Package_name.Map.t
81+
; (* Number of versions of each package whose opam files were read from
82+
disk while solving. Used to report performance statistics. *)
83+
expanded_packages : (Package_name.t, int) Table.t
8184
}
8285

8386
let create
@@ -105,6 +108,15 @@ module Context = struct
105108
end)
106109
1
107110
in
111+
let expanded_packages =
112+
Table.create
113+
(module struct
114+
include Package_name
115+
116+
let to_dyn = Package_name.to_dyn
117+
end)
118+
1
119+
in
108120
{ repos
109121
; version_preference
110122
; local_packages
@@ -115,6 +127,7 @@ module Context = struct
115127
; candidates_cache
116128
; available_cache
117129
; constraints
130+
; expanded_packages
118131
}
119132
;;
120133

@@ -180,6 +193,10 @@ module Context = struct
180193

181194
let repo_candidate t name =
182195
let+ resolved = Opam_repo.load_all_versions t.repos name in
196+
Table.add_exn
197+
t.expanded_packages
198+
(Package_name.of_opam_package_name name)
199+
(OpamPackage.Version.Map.cardinal resolved);
183200
let available =
184201
OpamPackage.Version.Map.values resolved
185202
|> List.map ~f:(fun p -> p, Priority.make (Resolved_package.opam_file p))
@@ -252,6 +269,8 @@ module Context = struct
252269
~with_test:package_is_local
253270
filtered_formula
254271
;;
272+
273+
let count_expanded_packages t = Table.fold t.expanded_packages ~init:0 ~f:( + )
255274
end
256275

257276
module Solver = struct
@@ -1738,6 +1757,7 @@ module Solver_result = struct
17381757
{ lock_dir : Lock_dir.t
17391758
; files : File_entry.t Package_name.Map.Multi.t
17401759
; pinned_packages : Package_name.Set.t
1760+
; num_expanded_packages : int
17411761
}
17421762
end
17431763

@@ -1965,5 +1985,10 @@ let solve_lock_dir
19651985
>>| List.filter ~f:(fun (_, entries) -> List.is_non_empty entries)
19661986
>>| Package_name.Map.of_list_exn
19671987
in
1968-
Ok { Solver_result.lock_dir; files; pinned_packages = pinned_package_names }
1988+
Ok
1989+
{ Solver_result.lock_dir
1990+
; files
1991+
; pinned_packages = pinned_package_names
1992+
; num_expanded_packages = Context.count_expanded_packages context
1993+
}
19691994
;;

src/dune_pkg/opam_solver.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Solver_result : sig
55
{ lock_dir : Lock_dir.t
66
; files : File_entry.t Package_name.Map.Multi.t
77
; pinned_packages : Package_name.Set.t
8+
; num_expanded_packages : int
89
}
910
end
1011

0 commit comments

Comments
 (0)