[m-rev.] for review: Cache timestamps by target file.
Zoltan Somogyi
zoltan.somogyi at runbox.com
Wed Nov 30 12:33:17 AEDT 2022
On Wed, 30 Nov 2022 12:04:54 +1100, Peter Wang <novalazy at gmail.com> wrote:
> @@ -59,8 +58,8 @@
>
> mki_file_timestamps :: file_timestamps,
>
> - % Cache chosen file names for a module name and extension.
> - mki_search_file_name_cache :: map(module_name_ext, file_name),
> + mki_target_file_timestamps
> + :: target_file_timestamps,
Everywhere in the code diff where you delete anything from mki_file_timestamps,
you also either delete the corresponding entry from mki_target_file_timestamps,
or mention why you don't have to. I think you should add a comment about the
invariant you are trying to maintain to the mki_file_timestamps field, to inform
future maintainers.
> + % This path is hit very frequently so it is worth caching timestamps by
> + % target_file. It avoids having to compute a file name for a
> + % target_file first, before looking up the timestamp for that file.
> + TargetFileTimestamps0 = !.Info ^ mki_target_file_timestamps,
> + ( if map.search(TargetFileTimestamps0, TargetFile, Timestamp) then
> + MaybeTimestamp = ok(Timestamp)
> + else
> + get_file_name(Globals, Search, TargetFile, FileName, !Info, !IO),
> + get_target_timestamp_2(Globals, Search, TargetFile,
> + FileName, MaybeTimestamp, !Info, !IO),
> + (
> + MaybeTimestamp = ok(Timestamp),
> + TargetFileTimestamps1 = !.Info ^ mki_target_file_timestamps,
> + map.det_insert(TargetFile, Timestamp,
> + TargetFileTimestamps1, TargetFileTimestamps),
> + !Info ^ mki_target_file_timestamps := TargetFileTimestamps
> + ;
> + MaybeTimestamp = error(_)
> + % Do not record errors. These would usually be due to files not
> + % yet made, and the result would have to be updated once the
> + % file is made.
> + )
> + )
If the map.search call is still a bottleneck, consider replacing the one stage map
map(target_file, timestamp) with the two stage map
map(module_name, map(module_target_type, timestamp)).
BTW, do you know why the first field of target_file is named
target_file_name, when it contains a MODULE name, not a FILE name?
If you don't, then I think it should be changed (in a separate diff).
The diff is fine.
Zoltan.
More information about the reviews
mailing list