From 0e36ca4000ca6a555c1531742a9c583482d1afac Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Fri, 8 Aug 2025 20:10:40 -0700 Subject: [PATCH] Optimize `QueryableExtensions`: preallocate immutable `Expression.Parameter` --- Orm/Xtensive.Orm/Orm/QueryableExtensions.Async.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/QueryableExtensions.Async.cs b/Orm/Xtensive.Orm/Orm/QueryableExtensions.Async.cs index ecbba9b1b..6bdb78554 100644 --- a/Orm/Xtensive.Orm/Orm/QueryableExtensions.Async.cs +++ b/Orm/Xtensive.Orm/Orm/QueryableExtensions.Async.cs @@ -16,6 +16,11 @@ namespace Xtensive.Orm /// public static partial class QueryableExtensions { + private static class ParameterTraits + { + public static readonly ParameterExpression[] ItemParam = [Expression.Parameter(typeof(TSource), "item")]; + } + private static readonly object BoxedZero = 0; /// @@ -1399,7 +1404,7 @@ public static async Task> ToDictionaryAsync> keySelector, CancellationToken cancellationToken = default) { var tupleFactoryMethod = TupleCreateMethod.CachedMakeGenericMethod(typeof(TKey), typeof(TSource)); - var itemParam = new[] {Expression.Parameter(typeof(TSource), "item")}; + var itemParam = ParameterTraits.ItemParam; var body = Expression.Call(null, tupleFactoryMethod, ExpressionReplacer.ReplaceAll(keySelector.Body, keySelector.Parameters, itemParam), itemParam[0]); @@ -1441,7 +1446,7 @@ public static async Task> ToDictionaryAsync.ItemParam; var body = Expression.Call(null, tupleFactoryMethod, ExpressionReplacer.ReplaceAll(keySelector.Body, keySelector.Parameters, itemParam), ExpressionReplacer.ReplaceAll(valueSelector.Body, valueSelector.Parameters, itemParam)); @@ -1506,7 +1511,7 @@ public static async Task> ToLookupAsync(th Expression> keySelector, CancellationToken cancellationToken = default) { var tupleFactoryMethod = TupleCreateMethod.CachedMakeGenericMethod(typeof(TKey), typeof(TSource)); - var itemParam = new[] {Expression.Parameter(typeof(TSource), "item")}; + var itemParam = ParameterTraits.ItemParam; var body = Expression.Call(null, tupleFactoryMethod, ExpressionReplacer.ReplaceAll(keySelector.Body, keySelector.Parameters, itemParam), itemParam[0]); @@ -1543,7 +1548,7 @@ public static async Task> ToLookupAsync.ItemParam; var body = Expression.Call(null, tupleFactoryMethod, ExpressionReplacer.ReplaceAll(keySelector.Body, keySelector.Parameters, itemParam), ExpressionReplacer.ReplaceAll(valueSelector.Body, valueSelector.Parameters, itemParam));