From 572ffe095630551075058f7d7ec2aeb93929dd15 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Fri, 19 May 2017 04:13:08 -0700 Subject: [PATCH] [CompilerPerf] Performance improvement in ComputeUngeneralizeableTypars (#3065) * Minor cleanup to TypeChecker signature - removed duplicated return value * Changed a bunch of set unioning to use an array instead * Used Add in a loop in ComputeUngeneralizableTypars, cut 5% of main0 runtime --- src/fsharp/TypeChecker.fs | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 378d12c27..8060a7005 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -2059,24 +2059,16 @@ type GeneralizeConstrainedTyparOptions = module GeneralizationHelpers = let ComputeUngeneralizableTypars env = - // This is just a List.fold. Unfolded here to enable better profiling - let rec loop acc (items: UngeneralizableItem list) = - match items with - | [] -> acc - | item::rest -> - let acc = - if item.WillNeverHaveFreeTypars then - acc - else - let ftps = item.GetFreeTyvars().FreeTypars - if ftps.IsEmpty then - acc - else - // These union operations are a performance sore point - unionFreeTypars ftps acc - loop acc rest + let acc = Collections.Generic.List() + for item in env.eUngeneralizableItems do + if not item.WillNeverHaveFreeTypars then + let ftps = item.GetFreeTyvars().FreeTypars + if not ftps.IsEmpty then + for ftp in ftps do + acc.Add(ftp) + + Zset.Create(typarOrder, acc) - loop emptyFreeTypars env.eUngeneralizableItems let ComputeUnabstractableTycons env = let acc_in_free_item acc (item: UngeneralizableItem) = -- GitLab