Skip to content

Commit c3cfbab

Browse files
Avoid pool for short buffers in FindIntersectionsWithOrientation
1 parent 2765e8d commit c3cfbab

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

src/ImageSharp.Drawing/Shapes/InternalPath.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,25 @@ public int FindIntersectionsWithOrientation(
245245
int position = 0;
246246
Vector2 lastPoint = MaxVector;
247247

248-
// TODO: This request can happen in huge numbers.
249-
PassPointData[] precaclulate = ArrayPool<PassPointData>.Shared.Rent(this.points.Length);
250-
Span<PassPointData> precaclulateSpan = precaclulate.AsSpan(0, this.points.Length);
248+
int max = this.points.Length;
249+
Span<PassPointData> precaclulateSpan;
250+
PassPointData[] precaclulate = null;
251+
252+
// Avoid pool overhead for short numbers.
253+
// This method can be called in high volume.
254+
unsafe
255+
{
256+
if (max < (1024 / sizeof(PassPointData)))
257+
{
258+
PassPointData* points = stackalloc PassPointData[max];
259+
precaclulateSpan = new Span<PassPointData>(points, max);
260+
}
261+
else
262+
{
263+
precaclulate = ArrayPool<PassPointData>.Shared.Rent(max);
264+
precaclulateSpan = precaclulate.AsSpan(0, this.points.Length);
265+
}
266+
}
251267

252268
try
253269
{
@@ -382,7 +398,10 @@ public int FindIntersectionsWithOrientation(
382398
}
383399
finally
384400
{
385-
ArrayPool<PassPointData>.Shared.Return(precaclulate);
401+
if (precaclulate != null)
402+
{
403+
ArrayPool<PassPointData>.Shared.Return(precaclulate);
404+
}
386405
}
387406
}
388407

0 commit comments

Comments
 (0)