From 8b5eaa2cd507291fb7d96740e7832892107c9664 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Fri, 1 Nov 2024 17:57:42 +0100 Subject: [PATCH] Cache delegates during Load --- .../util-core/src/main/scala/sbt/internal/util/Util.scala | 7 +++++++ main/src/main/scala/sbt/internal/Load.scala | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/internal/util-core/src/main/scala/sbt/internal/util/Util.scala b/internal/util-core/src/main/scala/sbt/internal/util/Util.scala index 028cd79a2..1ba2156f7 100644 --- a/internal/util-core/src/main/scala/sbt/internal/util/Util.scala +++ b/internal/util-core/src/main/scala/sbt/internal/util/Util.scala @@ -10,6 +10,8 @@ package sbt.internal.util import java.util.Locale +import scala.collection.concurrent.TrieMap + object Util { def makeList[T](size: Int, value: T): List[T] = List.fill(size)(value) @@ -71,4 +73,9 @@ object Util { extension [A](value: A) { def some: Option[A] = (Some(value): Option[A]) } + + private[sbt] def withCaching[A1, A2](f: A1 => A2): A1 => A2 = { + val cache = TrieMap.empty[A1, A2] + x => cache.getOrElseUpdate(x, f(x)) + } } diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 7cf3bb2c2..d010d233f 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -35,6 +35,7 @@ import java.net.URI import java.nio.file.{ Path, Paths } import scala.annotation.tailrec import scala.collection.mutable +import sbt.internal.util.Util private[sbt] object Load { // note that there is State passed in but not pulled out @@ -266,11 +267,14 @@ private[sbt] object Load { } val projects = loaded.units lazy val rootEval = lazyEval(loaded.units(loaded.root).unit) + val settings0 = timed("Load.apply: buildConfigurations", log) { + buildConfigurations(loaded, getRootProject(projects), config.injectSettings) + } val settings = timed("Load.apply: finalTransforms", log) { - finalTransforms(buildConfigurations(loaded, getRootProject(projects), config.injectSettings)) + finalTransforms(settings0) } val delegates = timed("Load.apply: config.delegates", log) { - config.delegates(loaded) + Util.withCaching(config.delegates(loaded)) } val (cMap, data) = timed("Load.apply: Def.make(settings)...", log) { // When settings.size is 100000, Def.make takes around 10s.