Optimize Parallel instance in GenSpawnInstances to avoid allocation.#4599
Open
nmichael44 wants to merge 1 commit into
Open
Optimize Parallel instance in GenSpawnInstances to avoid allocation.#4599nmichael44 wants to merge 1 commit into
nmichael44 wants to merge 1 commit into
Conversation
…Caches the and FunctionK instances in a private companion object using an Id cast.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Currently in
GenSpawnInstances, theParallelinstance provides.paralleland.sequentialasdefs that instantiate anew (M ~> F)andnew (F ~> M)on every invocation.Because operations like
cats.Parallel.parTraverseinvokeP.parallel(ma)andP.sequential(ma)for every item in the collection, this creates a large number ofFunctionKobject allocations during a traversal, putting unnecessary pressure on the garbage collector.Changes
This PR eliminates these allocations by applying the
Idcaching technique (similar toResource.liftK).FunctionKinstances into aprivate object GenSpawnInstancesto act as true JVM-wide singletons (rather than trait fields).asInstanceOfto cast the cachedIdtransformations to the required effect type at the call site.Impact
Zero-allocation
parallelandsequentialtransformations for all effect types that implementGenSpawn. This reduces the memory footprint and GC overhead on hot paths involving parallel collections processing.