Skip to content

Commit d4e424b

Browse files
committed
Rent an array instead of creating List<> in GetUnifiedConverter.
1 parent ce3c611 commit d4e424b

File tree

1 file changed

+39
-26
lines changed

1 file changed

+39
-26
lines changed

src/Core/Transformation/Transformer.cs

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Concurrent;
1+
using System.Buffers;
2+
using System.Collections.Concurrent;
23
using System.Diagnostics.CodeAnalysis;
34
using System.Reflection;
45

@@ -94,49 +95,61 @@ public bool TryTransform<TSource, TTarget>(TSource source, IGremlinQueryEnvironm
9495
private IConverter<TStaticSource, TTarget> GetUnifiedConverter<TStaticSource, TActualSource, TTarget>(IGremlinQueryEnvironment environment)
9596
where TActualSource : TStaticSource
9697
{
98+
var tupleCount = 0;
9799
var deferTransformers = _deferTransformers;
98-
var list = new List<(IConverter<TActualSource, TTarget> converter, TransformerImpl overridden)>();
100+
var arrayPool = ArrayPool<(IConverter<TActualSource, TTarget> converter, TransformerImpl overridden)>.Shared;
99101

100-
for (var i = _converterFactories.Count - 1; i >= 0; i--)
102+
var tuples = arrayPool
103+
.Rent(_converterFactories.Count);
104+
105+
try
101106
{
102-
if (_converterFactories[i].TryCreate<TActualSource, TTarget>(environment) is { } converter)
107+
for (var i = _converterFactories.Count - 1; i >= 0; i--)
103108
{
104-
TransformerImpl? deferTransformer;
105-
106-
while (true)
109+
if (_converterFactories[i].TryCreate<TActualSource, TTarget>(environment) is { } converter)
107110
{
108-
if (deferTransformers is { } existingDeferTransformers)
111+
TransformerImpl? deferTransformer;
112+
113+
while (true)
109114
{
110-
if (existingDeferTransformers[i] is { } existingDeferTransformer)
115+
if (deferTransformers is { } existingDeferTransformers)
111116
{
112-
deferTransformer = existingDeferTransformer;
117+
if (existingDeferTransformers[i] is { } existingDeferTransformer)
118+
{
119+
deferTransformer = existingDeferTransformer;
120+
121+
break;
122+
}
123+
else
124+
{
125+
deferTransformer = new TransformerImpl(_converterFactories[..i], this);
113126

114-
break;
127+
if (Interlocked.CompareExchange(ref deferTransformers[i], deferTransformer, null) is { } otherDeferTransformer)
128+
deferTransformer = otherDeferTransformer;
129+
130+
break;
131+
}
115132
}
116133
else
117134
{
118-
deferTransformer = new TransformerImpl(_converterFactories[..i], this);
119-
120-
if (Interlocked.CompareExchange(ref deferTransformers[i], deferTransformer, null) is { } otherDeferTransformer)
121-
deferTransformer = otherDeferTransformer;
135+
deferTransformers = new TransformerImpl[_converterFactories.Count];
122136

123-
break;
137+
if (Interlocked.CompareExchange(ref _deferTransformers, deferTransformers, null) is { } otherDeferTransformers)
138+
deferTransformers = otherDeferTransformers;
124139
}
125140
}
126-
else
127-
{
128-
deferTransformers = new TransformerImpl[_converterFactories.Count];
129141

130-
if (Interlocked.CompareExchange(ref _deferTransformers, deferTransformers, null) is { } otherDeferTransformers)
131-
deferTransformers = otherDeferTransformers;
132-
}
142+
tuples[tupleCount++] = (converter, deferTransformer);
133143
}
134-
135-
list.Add((converter, deferTransformer));
136144
}
137-
}
138145

139-
return new UnifiedConverter<TStaticSource, TActualSource, TTarget>([.. list], _recurse);
146+
return new UnifiedConverter<TStaticSource, TActualSource, TTarget>([.. tuples[0..tupleCount]], _recurse);
147+
}
148+
finally
149+
{
150+
arrayPool
151+
.Return(tuples);
152+
}
140153
}
141154
}
142155

0 commit comments

Comments
 (0)