perf: avoid closure allocation in BeforeHookTaskCache.GetOrCreateBeforeAssemblyTask (original) (raw)

TUnit.Engine/Services/BeforeHookTaskCache.cs:36-40:

public ValueTask GetOrCreateBeforeAssemblyTask(Assembly assembly, Func<Assembly, CancellationToken, ValueTask> taskFactory, CancellationToken cancellationToken) { var task = _beforeAssemblyTasks.GetOrAdd(assembly, a => taskFactory(a, cancellationToken).AsTask()); return new ValueTask(task); }

The a => lambda captures taskFactory + cancellationToken, allocating a closure on every call, including cache hits where the factory never runs.

The sibling GetOrCreateBeforeClassTask at line 44+ already implements the fix pattern: TryGetValue fast path first, then GetOrAdd only on miss. Mirror that here.

Why hot: Once per assembly per test session, but the closure alloc happens per GetOrCreate call, not per cache miss.
TFM: No gating.