diff options
author | 2014-08-09 13:18:25 +0200 | |
---|---|---|
committer | 2014-08-09 13:19:06 +0200 | |
commit | eec72af81a84f7b56b04027693684eebe139a607 (patch) | |
tree | 795942dc666a904a716bfabe70fe3eeb5d1460ef | |
parent | ff884c172697c1452db535cdbd6babceb556c428 (diff) |
Tentative performance fix for Evd.merge_uctx.
The levels added by the context are in general much fewer than the size of the
evarmap, so it is better to add them to the latter rather than doing it the
other way around.
-rw-r--r-- | pretyping/evd.ml | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/pretyping/evd.ml b/pretyping/evd.ml index cd02d7228..c60fb2958 100644 --- a/pretyping/evd.ml +++ b/pretyping/evd.ml @@ -960,8 +960,11 @@ let merge_uctx rigid uctx ctx' = | UnivRigid -> uctx | UnivFlexible b -> let levels = Univ.ContextSet.levels ctx' in - let uvars' = Univ.LMap.bind (fun _ -> None) levels in - let uvars' = Univ.LMap.fold Univ.LMap.add uctx.uctx_univ_variables uvars' in + let fold u accu = + if Univ.LMap.mem u accu then accu + else Univ.LMap.add u None accu + in + let uvars' = Univ.LSet.fold fold levels uctx.uctx_univ_variables in if b then { uctx with uctx_univ_variables = uvars'; uctx_univ_algebraic = Univ.LSet.union uctx.uctx_univ_algebraic levels } |