8000 Merge remote-tracking branch 'origin/main' into dataframe_primitiveco… · dotnet/machinelearning@9654516 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9654516

Browse files
committed
Merge remote-tracking branch 'origin/main' into dataframe_primitivecolumncontainer_refactoring
# Conflicts: # src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs # test/Microsoft.Data.Analysis.Tests/BufferTests.cs
2 parents dfe8d12 + 85ee6e5 commit 9654516

23 files changed

+941
-1057
lines changed

Microsoft.ML.sln

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Tokenizers.Tes
168168
EndProject
169169
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Microsoft.ML.FSharp.Tests", "test\Microsoft.ML.FSharp.Tests\Microsoft.ML.FSharp.Tests.fsproj", "{041CB5CD-5832-413E-A894-D9DBED210B16}"
170170
EndProject
171+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Data.Analysis.PerformanceTests", "test\Microsoft.Data.Analysis.PerformanceTests\Microsoft.Data.Analysis.PerformanceTests.csproj", "{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}"
172+
EndProject
171173
Global
172174
GlobalSection(SolutionConfigurationPlatforms) = preSolution
173175
Debug|Any CPU = Debug|Any CPU
@@ -788,6 +790,14 @@ Global
788790
{041CB5CD-5832-413E-A894-D9DBED210B16}.Release|Any CPU.Build.0 = Release|Any CPU
789791
{041CB5CD-5832-413E-A894-D9DBED210B16}.Release|x64.ActiveCfg = Release|Any CPU
790792
{041CB5CD-5832-413E-A894-D9DBED210B16}.Release|x64.Build.0 = Release|Any CPU
793+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
794+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
795+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Debug|x64.ActiveCfg = Debug|Any CPU
796+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Debug|x64.Build.0 = Debug|Any CPU
797+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
798+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Release|Any CPU.Build.0 = Release|Any CPU
799+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Release|x64.ActiveCfg = Release|Any CPU
800+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD}.Release|x64.Build.0 = Release|Any CPU
791801
EndGlobalSection
792802
GlobalSection(SolutionProperties) = preSolution
793803
HideSolutionNode = FALSE
@@ -870,6 +880,7 @@ Global
870880
{BBC3A950-BD68-45AC-9DBD-A8F4D8847745} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
871881
{C3D82402-F207-4F19-8C57-5AF0FBAF9682} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4}
872882
{041CB5CD-5832-413E-A894-D9DBED210B16} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4}
883+
{FB8A8823-CC6C-4C2F-8539-05FBFB7C91CD} = {AED9C836-31E3-4F3F-8ABC-929555D3F3C4}
873884
EndGlobalSection
874885
GlobalSection(ExtensibilityGlobals) = postSolution
875886
SolutionGuid = {41165AF1-35BB-4832-A189-73060F82B01D}

eng/Versions.props

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
<LightGBMVersion>2.3.1</LightGBMVersion>
3636
<MicrosoftCodeAnalysisAnalyzersVersion>3.3.0</MicrosoftCodeAnalysisAnalyzersVersion>
3737
<MicrosoftCodeAnalysisCSharpVersion>3.9.0</MicrosoftCodeAnalysisCSharpVersion>
38-
<MicrosoftDotNetInteractiveFormattingVersion>1.0.0-beta.22504.6</MicrosoftDotNetInteractiveFormattingVersion>
39-
<MicrosoftDotNetInteractiveVersion>1.0.0-beta.22504.6</MicrosoftDotNetInteractiveVersion>
38+
<MicrosoftDotNetInteractiveFormattingVersion>1.0.0-beta.23461.4</MicrosoftDotNetInteractiveFormattingVersion>
39+
<MicrosoftDotNetInteractiveVersion>1.0.0-beta.23461.4</MicrosoftDotNetInteractiveVersion>
4040
<MicrosoftMLOnnxRuntimeVersion>1.14.0</MicrosoftMLOnnxRuntimeVersion>
4141
<MlNetMklDepsVersion>0.0.0.12</MlNetMklDepsVersion>
4242
<!--
@@ -74,7 +74,7 @@
7474
<SystemCompositionVersion>1.2.0</SystemCompositionVersion>
7575
<!-- Test-only Dependencies -->
7676
<ApprovalTestsVersion>5.4.7</ApprovalTestsVersion>
77-
<BenchmarkDotNetVersion>0.12.0</BenchmarkDotNetVersion>
77+
<BenchmarkDotNetVersion>0.13.1</BenchmarkDotNetVersion>
7878
<DotNetRuntime60Version>6.0.9</DotNetRuntime60Version>
7979
<DotNetRuntime80Version>8.0.0-preview.3.23174.8</DotNetRuntime80Version>
8080
<FluentAssertionVersion>5.10.2</FluentAssertionVersion>

src/Microsoft.Data.Analysis.Interactive/TabularDataResourceExtensions.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Collections.Generic;
67
using System.Linq;
78
using Microsoft.Data.Analysis;
89

@@ -22,19 +23,32 @@ public static DataFrame ToDataFrame(this TabularDataResource tabularDataResource
2223

2324
foreach (var fieldDescriptor in tabularDataResource.Schema.Fields)
2425
{
26+
var fieldName = fieldDescriptor.Name;
27+
var column = tabularDataResource.Data.Select(row =>
28+
{
29+
if (row is IDictionary<string, object> dictionary)
30+
{
31+
return dictionary[fieldName];
32+
}
33+
else
34+
{
35+
return row.FirstOrDefault(kvp => kvp.Key == fieldName).Value;
36+
}
37+
});
38+
2539
switch (fieldDescriptor.Type)
2640
{
2741
case TableSchemaFieldType.Number:
28-
dataFrame.Columns.Add(new DoubleDataFrameColumn(fieldDescriptor.Name, tabularDataResource.Data.Select(d => Convert.ToDouble(d[fieldDescriptor.Name]))));
42+
dataFrame.Columns.Add(new DoubleDataFrameColumn(fieldDescriptor.Name, column.Select(Convert.ToDouble)));
2943
break;
3044
case TableSchemaFieldType.Integer:
31-
dataFrame.Columns.Add(new Int64DataFrameColumn(fieldDescriptor.Name, tabularDataResource.Data.Select(d => Convert.ToInt64(d[fieldDescriptor.Name]))));
45+
dataFrame.Columns.Add(new Int64DataFrameColumn(fieldDescriptor.Name, column.Select(Convert.ToInt64)));
3246
break;
3347
case TableSchemaFieldType.Boolean:
34-
dataFrame.Columns.Add(new BooleanDataFrameColumn(fieldDescriptor.Name, tabularDataResource.Data.Select(d => Convert.ToBoolean(d[fieldDescriptor.Name]))));
48+
dataFrame.Columns.Add(new BooleanDataFrameColumn(fieldDescriptor.Name, column.Select(Convert.ToBoolean)));
3549
break;
3650
case TableSchemaFieldType.String:
37-
dataFrame.Columns.Add(new StringDataFrameColumn(fieldDescriptor.Name, tabularDataResource.Data.Select(d => Convert.ToString(d[fieldDescriptor.Name]))));
51+
dataFrame.Columns.Add(new StringDataFrameColumn(fieldDescriptor.Name, column.Select(Convert.ToString)));
3852
break;
3953
default:
4054
throw new ArgumentOutOfRangeException();

src/Microsoft.Data.Analysis/ArrowStringDataFrameColumn.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,9 @@ private void Append(ReadOnlySpan<byte> value)
213213
_offsetsBuffers.Add(mutableOffsetsBuffer);
214214
mutableOffsetsBuffer.Append(0);
215215
}
216-
mutableDataBuffer.EnsureCapacity(value.Length);
217-
value.CopyTo(mutableDataBuffer.RawSpan.Slice(mutableDataBuffer.Length));
218-
mutableDataBuffer.Length += value.Length;
216+
var startIndex = mutableDataBuffer.Length;
217+
mutableDataBuffer.IncreaseSize(value.Length);
218+
value.CopyTo(mutableDataBuffer.RawSpan.Slice(startIndex));
219219
mutableOffsetsBuffer.Append(mutableOffsetsBuffer[mutableOffsetsBuffer.Length - 1] + value.Length);
220220
}
221221
SetValidityBit(Length - 1, value != default);

src/Microsoft.Data.Analysis/DataFrameBuffer.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ namespace Microsoft.Data.Analysis
1515
internal class DataFrameBuffer<T> : ReadOnlyDataFrameBuffer<T>
1616
where T : unmanaged
1717
{
18+
private const int MinCapacity = 8;
19+
1820
private Memory<byte> _memory;
1921

2022
public override ReadOnlyMemory<byte> ReadOnlyBuffer => _memory;
@@ -36,24 +38,35 @@ public Span<T> RawSpan
3638
get => MemoryMarshal.Cast<byte, T>(Buffer.Span);
3739
}
3840

39-
public DataFrameBuffer(int numberOfValues = 8) : base(numberOfValues) { }
41+
public DataFrameBuffer(int capacity = 0)
42+
{
43+
if ((long)capacity * Size > MaxCapacity)
44+
{
45+
throw new ArgumentException($"{capacity} exceeds buffer capacity", nameof(capacity));
46+
}
47+
48+
_memory = new byte[Math.Max(capacity, MinCapacity)];
49+
}
4050

41-
internal DataFrameBuffer(ReadOnlyMemory<byte> buffer, int length) : base(buffer, length)
51+
internal DataFrameBuffer(ReadOnlyMemory<byte> buffer, int length)
4252
{
4353
_memory = new byte[buffer.Length];
4454
buffer.CopyTo(_memory);
55+
Length = length;
4556
}
4657

4758
public void Append(T value)
4859
{
49-
if (Length == MaxCapacity)
50-
{
51-
throw new ArgumentException("Current buffer is full", nameof(value));
52-
}
5360
EnsureCapacity(1);
54-
if (Length < MaxCapacity)
55-
++Length;
56-
Span[Length - 1] = value;
61+
62+
RawSpan[Length] = value;
63+
Length++;
64+
}
65+
66+
public void IncreaseSize(int numberOfValues)
67+
{
68+
EnsureCapacity(numberOfValues);
69+
Length += numberOfValues;
5770
}
5871

5972
public void EnsureCapacity(int numberOfValues)

src/Microsoft.Data.Analysis/PrimitiveColumnContainer.cs

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,8 @@ public PrimitiveColumnContainer(ReadOnlyMemory<byte> buffer, ReadOnlyMemory<byte
160160
ReadOnlyDataFrameBuffer<T> dataBuffer;
161161
if (buffer.IsEmpty)
162162
{
163-
DataFrameBuffer<T> mutableBuffer = new DataFrameBuffer<T>();
164-
mutableBuffer.EnsureCapacity(length);
165-
mutableBuffer.Length = length;
163+
DataFrameBuffer<T> mutableBuffer = new DataFrameBuffer<T>(length);
164+
mutableBuffer.IncreaseSize(length);
166165
mutableBuffer.RawSpan.Fill(default(T));
167166
dataBuffer = mutableBuffer;
168167
}
@@ -267,14 +266,11 @@ public void AppendMany(T? value, long count)
267266
//Calculate how many values we can additionaly allocate and not exceed the MaxCapacity
268267
int originalBufferLength = mutableLastBuffer.Length;
269268
int allocatable = (int)Math.Min(remaining, ReadOnlyDataFrameBuffer<T>.MaxCapacity - originalBufferLength);
270-
mutableLastBuffer.EnsureCapacity(allocatable);
269+
mutableLastBuffer.IncreaseSize(allocatable);
271270

272271
//Calculate how many bytes we have additionaly allocate to store allocatable number of bits (need to take into account unused bits inside already allocated bytes)
273272
int nullBufferAllocatable = (originalBufferLength + allocatable + 7) / 8 - lastNullBitMapBuffer.Length;
274-
lastNullBitMapBuffer.EnsureCapacity(nullBufferAllocatable);
275-
276-
mutableLastBuffer.Length += allocatable;
277-
lastNullBitMapBuffer.Length += nullBufferAllocatable;
273+
lastNullBitMapBuffer.IncreaseSize(nullBufferAllocatable);
278274
Length += allocatable;
279275

280276
if (value.HasValue)
@@ -524,13 +520,8 @@ private List<ReadOnlyDataFrameBuffer<byte>> CloneNullBitMapBuffers()
524520
List<ReadOnlyDataFrameBuffer<byte>> ret = new List<ReadOnlyDataFrameBuffer<byte>>();
525521
foreach (ReadOnlyDataFrameBuffer<byte> buffer in NullBitMapBuffers)
526522
{
527-
DataFrameBuffer<byte> newBuffer = new DataFrameBuffer<byte>();
523+
DataFrameBuffer<byte> newBuffer = new DataFrameBuffer<byte>(buffer.ReadOnlyBuffer, buffer.Length);
528524
ret.Add(newBuffer);
529-
ReadOnlySpan<byte> span = buffer.ReadOnlySpan;
530-
for (int i = 0; i < span.Length; i++)
531-
{
532-
newBuffer.Append(span[i]);
533-
}
534525
}
535526
return ret;
536527
}
@@ -606,14 +597,9 @@ public PrimitiveColumnContainer<T> Clone()
606597
var ret = new PrimitiveColumnContainer<T>();
607598
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
608599
{
609-
DataFrameBuffer<T> newBuffer = new DataFrameBuffer<T>();
600+
DataFrameBuffer<T> newBuffer = new DataFrameBuffer<T>(buffer.ReadOnlyBuffer, buffer.Length);
610601
ret.Buffers.Add(newBuffer);
611-
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
612602
ret.Length += buffer.Length;
613-
for (int i = 0; i < span.Length; i++)
614-
{
615-
newBuffer.Append(span[i]);
616-
}
617603
}
618604
ret.NullBitMapBuffers = CloneNullBitMapBuffers();
619605
ret.NullCount = NullCount;
@@ -625,9 +611,10 @@ internal PrimitiveColumnContainer<bool> CloneAsBoolContainer()
625611
var ret = new PrimitiveColumnContainer<bool>();
626612
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
627613
{
628-
DataFrameBuffer<bool> newBuffer = new DataFrameBuffer<bool>();
614+
DataFrameBuffer<bool> newBuffer = new DataFrameBuffer<bool>(buffer.Length);
629615
ret.Buffers.Add(newBuffer);
630-
newBuffer.EnsureCapacity(buffer.Length);
616+
newBuffer.IncreaseSize(buffer.Length);
617+
631618
if (typeof(T) == typeof(bool))
632619
{
633620
var localBuffer = buffer;
@@ -638,7 +625,6 @@ internal PrimitiveColumnContainer<bool> CloneAsBoolContainer()
638625
{
639626
newBuffer.Span.Fill(false);
640627
}
641-
newBuffer.Length = buffer.Length;
642628
ret.Length += buffer.Length;
643629
}
644630
ret.NullBitMapBuffers = CloneNullBitMapBuffers();
@@ -652,9 +638,8 @@ internal PrimitiveColumnContainer<byte> CloneAsByteContainer()
652638
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
653639
{
654640
ret.Length += buffer.Length;
655-
DataFrameBuffer<byte> newBuffer = new DataFrameBuffer<byte>();
641+
DataFrameBuffer<byte> newBuffer = new DataFrameBuffer<byte>(buffer.Length);
656642
ret.Buffers.Add(newBuffer);
657-
newBuffer.EnsureCapacity(buffer.Length);
658643
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
659644
for (int i = 0; i < span.Length; i++)
660645
{
@@ -672,9 +657,8 @@ internal PrimitiveColumnContainer<sbyte> CloneAsSByteContainer()
672657
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
673658
{
674659
ret.Length += buffer.Length;
675-
DataFrameBuffer<sbyte> newBuffer = new DataFrameBuffer<sbyte>();
660+
DataFrameBuffer<sbyte> newBuffer = new DataFrameBuffer<sbyte>(buffer.Length);
676661
ret.Buffers.Add(newBuffer);
677-
newBuffer.EnsureCapacity(buffer.Length);
678662
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
679663
for (int i = 0; i < span.Length; i++)
680664
{
@@ -692,9 +676,8 @@ internal PrimitiveColumnContainer<double> CloneAsDoubleContainer()
692676
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
693677
{
694678
ret.Length += buffer.Length;
695-
DataFrameBuffer<double> newBuffer = new DataFrameBuffer<double>();
679+
DataFrameBuffer<double> newBuffer = new DataFrameBuffer<double>(buffer.Length);
696680
ret.Buffers.Add(newBuffer);
697-
newBuffer.EnsureCapacity(buffer.Length);
698681
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
699682
for (int i = 0; i < span.Length; i++)
700683
{
@@ -712,9 +695,8 @@ internal PrimitiveColumnContainer<decimal> CloneAsDecimalContainer()
712695
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
713696
{
714697
ret.Length += buffer.Length;
715-
DataFrameBuffer<decimal> newBuffer = new DataFrameBuffer<decimal>();
698+
DataFrameBuffer<decimal> newBuffer = new DataFrameBuffer<decimal>(buffer.Length);
716699
ret.Buffers.Add(newBuffer);
717-
newBuffer.EnsureCapacity(buffer.Length);
718700
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
719701
for (int i = 0; i < span.Length; i++)
720702
{
@@ -732,9 +714,8 @@ internal PrimitiveColumnContainer<short> CloneAsShortContainer()
732714
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
733715
{
734716
ret.Length += buffer.Length;
735-
DataFrameBuffer<short> newBuffer = new DataFrameBuffer<short>();
717+
DataFrameBuffer<short> newBuffer = new DataFrameBuffer<short>(buffer.Length);
736718
ret.Buffers.Add(newBuffer);
737-
newBuffer.EnsureCapacity(buffer.Length);
738719
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
739720
for (int i = 0; i < span.Length; i++)
740721
{
@@ -752,9 +733,8 @@ internal PrimitiveColumnContainer<ushort> CloneAsUShortContainer()
752733
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
753734
{
754735
ret.Length += buffer.Length;
755-
DataFrameBuffer<ushort> newBuffer = new DataFrameBuffer<ushort>();
736+
DataFrameBuffer<ushort> newBuffer = new DataFrameBuffer<ushort>(buffer.Length);
756737
ret.Buffers.Add(newBuffer);
757-
newBuffer.EnsureCapacity(buffer.Length);
758738
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
759739
for (int i = 0; i < span.Length; i++)
760740
{
@@ -772,9 +752,8 @@ internal PrimitiveColumnContainer<int> CloneAsIntContainer()
772752
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
773753
{
774754
ret.Length += buffer.Length;
775-
DataFrameBuffer<int> newBuffer = new DataFrameBuffer<int>();
755+
DataFrameBuffer<int> newBuffer = new DataFrameBuffer<int>(buffer.Length);
776756
ret.Buffers.Add(newBuffer);
777-
newBuffer.EnsureCapacity(buffer.Length);
778757
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
779758
for (int i = 0; i < span.Length; i++)
780759
{
@@ -792,9 +771,8 @@ internal PrimitiveColumnContainer<uint> CloneAsUIntContainer()
792771
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
793772
{
794773
ret.Length += buffer.Length;
795-
DataFrameBuffer<uint> newBuffer = new DataFrameBuffer<uint>();
774+
DataFrameBuffer<uint> newBuffer = new DataFrameBuffer<uint>(buffer.Length);
796775
ret.Buffers.Add(newBuffer);
797-
newBuffer.EnsureCapacity(buffer.Length);
798776
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
799777
for (int i = 0; i < span.Length; i++)
800778
{
@@ -812,9 +790,8 @@ internal PrimitiveColumnContainer<long> CloneAsLongContainer()
812790
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
813791
{
814792
ret.Length += buffer.Length;
815-
DataFrameBuffer<long> newBuffer = new DataFrameBuffer<long>();
793+
DataFrameBuffer<long> newBuffer = new DataFrameBuffer<long>(buffer.Length);
816794
ret.Buffers.Add(newBuffer);
817-
newBuffer.EnsureCapacity(buffer.Length);
818795
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
819796
for (int i = 0; i < span.Length; i++)
820797
{
@@ -832,9 +809,8 @@ internal PrimitiveColumnContainer<ulong> CloneAsULongContainer()
832809
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
833810
{
834811
ret.Length += buffer.Length;
835-
DataFrameBuffer<ulong> newBuffer = new DataFrameBuffer<ulong>();
812+
DataFrameBuffer<ulong> newBuffer = new DataFrameBuffer<ulong>(buffer.Length);
836813
ret.Buffers.Add(newBuffer);
837-
newBuffer.EnsureCapacity(buffer.Length);
838814
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
839815
for (int i = 0; i < span.Length; i++)
840816
{
@@ -852,9 +828,8 @@ internal PrimitiveColumnContainer<float> CloneAsFloatContainer()
852828
foreach (ReadOnlyDataFrameBuffer<T> buffer in Buffers)
853829
{
854830
ret.Length += buffer.Length;
855-
DataFrameBuffer<float> newBuffer = new DataFrameBuffer<float>();
831+
DataFrameBuffer<float> newBuffer = new DataFrameBuffer<float>(buffer.Length);
856832
ret.Buffers.Add(newBuffer);
857-
newBuffer.EnsureCapacity(buffer.Length);
858833
ReadOnlySpan<T> span = buffer.ReadOnlySpan;
859834
for (int i = 0; i < span.Length; i++)
860835
{

0 commit comments

Comments
 (0)
0