diff options
author | Ahson Khan <ahkha@microsoft.com> | 2018-04-10 08:00:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-10 08:00:13 +0300 |
commit | 1dfe097dc0201564e61461731058569a20517183 (patch) | |
tree | 19bc8eca1424040470d659ed4c8202c601be6a6a /src/System.Memory/tests | |
parent | 14f5d53b9b9badd9402a9331b9f1b8cbd30b5c85 (diff) |
Fix MemoryManager ctor, add unit and perf tests, and improve performance (#28880)
* Fix MemoryManager ctor, add unit and perf tests, and improve performance.
* Remove Dangerous Span Ctor
* Fix sort order in csproj and rename Perf.MemorySlice.cs to Perf.Memory.Slice
* Fix MemoryManager ctor and use internal span ctor to improve performance (#17452)
* Fix MemoryManager ctor, add unit and perf tests, and use internal span ctor.
* Address PR feedback (remove use of Unsafe.As and Dangerous Span Ctor)
Signed-off-by: dotnet-bot-corefx-mirror <dotnet-bot@microsoft.com>
Diffstat (limited to 'src/System.Memory/tests')
-rw-r--r-- | src/System.Memory/tests/Memory/MemoryManager.cs | 27 | ||||
-rw-r--r-- | src/System.Memory/tests/Memory/Span.cs | 30 | ||||
-rw-r--r-- | src/System.Memory/tests/Performance/Perf.Memory.Slice.cs (renamed from src/System.Memory/tests/Performance/Perf.MemorySlice.cs) | 0 | ||||
-rw-r--r-- | src/System.Memory/tests/Performance/Perf.Memory.Span.cs | 166 | ||||
-rw-r--r-- | src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj | 3 | ||||
-rw-r--r-- | src/System.Memory/tests/ReadOnlyMemory/Span.cs | 29 |
6 files changed, 254 insertions, 1 deletions
diff --git a/src/System.Memory/tests/Memory/MemoryManager.cs b/src/System.Memory/tests/Memory/MemoryManager.cs index 4f6f2461cf..5a6c675c72 100644 --- a/src/System.Memory/tests/Memory/MemoryManager.cs +++ b/src/System.Memory/tests/Memory/MemoryManager.cs @@ -28,6 +28,33 @@ namespace System.MemoryTests } [Fact] + public static void MemoryManagerCtorDefault() + { + MemoryManager<int> managerInt = default; + Assert.Throws<ArgumentNullException>(() => new Memory<int>(managerInt, 0, 0)); + + managerInt = null; + Assert.Throws<ArgumentNullException>(() => new Memory<int>(managerInt, 0, 0)); + + MemoryManager<object> managerObject = default; + Assert.Throws<ArgumentNullException>(() => new Memory<object>(managerObject, 0, 0)); + } + + [Fact] + public static void MemoryManagerCtorInvalid() + { + int[] a = { 91, 92, -93, 94 }; + MemoryManager<int> manager = new CustomMemoryForTest<int>(a); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, 0, -1)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, -1, 0)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, -1, -1)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, -1, -1)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, 0, a.Length + 1)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, a.Length + 1, 0)); + Assert.Throws<ArgumentOutOfRangeException>(() => new Memory<int>(manager, 1, a.Length)); + } + + [Fact] public static void ReadOnlyMemoryFromMemoryFromMemoryManagerInt() { int[] a = { 91, 92, -93, 94 }; diff --git a/src/System.Memory/tests/Memory/Span.cs b/src/System.Memory/tests/Memory/Span.cs index 55ed001b3d..55956dd6ab 100644 --- a/src/System.Memory/tests/Memory/Span.cs +++ b/src/System.Memory/tests/Memory/Span.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Buffers; +using System.Runtime.InteropServices; using Xunit; namespace System.MemoryTests @@ -42,6 +43,22 @@ namespace System.MemoryTests } [Fact] + public static void SpanFromCtorArrayChar() + { + char[] a = { '1', '2', '3', '4', '-' }; + Memory<char> memory; + + memory = new Memory<char>(a); + memory.Span.Validate('1', '2', '3', '4', '-'); + + memory = new Memory<char>(a, 0, a.Length); + memory.Span.Validate('1', '2', '3', '4', '-'); + + MemoryManager<char> manager = new CustomMemoryForTest<char>(a); + manager.Memory.Span.Validate('1', '2', '3', '4', '-'); + } + + [Fact] public static void SpanFromCtorArrayObject() { object o1 = new object(); @@ -60,6 +77,19 @@ namespace System.MemoryTests } [Fact] + public static void SpanFromStringAsMemory() + { + string a = "1234-"; + ReadOnlyMemory<char> memory; + + memory = a.AsMemory(); + MemoryMarshal.AsMemory(memory).Span.Validate('1', '2', '3', '4', '-'); + + memory = a.AsMemory(0, a.Length); + MemoryMarshal.AsMemory(memory).Span.Validate('1', '2', '3', '4', '-'); + } + + [Fact] public static void SpanFromCtorArrayZeroLength() { int[] empty = Array.Empty<int>(); diff --git a/src/System.Memory/tests/Performance/Perf.MemorySlice.cs b/src/System.Memory/tests/Performance/Perf.Memory.Slice.cs index 27cecdef49..27cecdef49 100644 --- a/src/System.Memory/tests/Performance/Perf.MemorySlice.cs +++ b/src/System.Memory/tests/Performance/Perf.Memory.Slice.cs diff --git a/src/System.Memory/tests/Performance/Perf.Memory.Span.cs b/src/System.Memory/tests/Performance/Perf.Memory.Span.cs new file mode 100644 index 0000000000..f2db92e0f4 --- /dev/null +++ b/src/System.Memory/tests/Performance/Perf.Memory.Span.cs @@ -0,0 +1,166 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Buffers; +using System.MemoryTests; +using Microsoft.Xunit.Performance; +using Xunit; + +namespace System.Memory.Tests +{ + public class Perf_Memory_Span + { + private const int InnerCount = 1_000_000; + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromDefaultIntegerMemory() + { + Memory<int> memory = default; + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<int> span = memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromIntegerArrayBackedMemory() + { + int[] a = { 91, 92, -93, 94 }; + var memory = new Memory<int>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<int> span = memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromCharArrayBackedMemory() + { + char[] a = "9192-9394".ToCharArray(); + var memory = new Memory<char>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<char> span = memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromObjectArrayBackedMemory() + { + object o1 = new object(); + object o2 = new object(); + object[] a = { o1, o2 }; + var memory = new Memory<object>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<object> span = memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromStringBackedMemory() + { + string a = "9192-9394"; + ReadOnlyMemory<char> memory = a.AsMemory(); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + ReadOnlySpan<char> span = memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromIntegerMemoryManager() + { + int[] a = { 91, 92, -93, 94 }; + var memory = new Memory<int>(a); + MemoryManager<int> manager = new CustomMemoryForTest<int>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<int> span = manager.Memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromCharMemoryManager() + { + char[] a = "9192-9394".ToCharArray(); + var memory = new Memory<char>(a); + MemoryManager<char> manager = new CustomMemoryForTest<char>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<char> span = manager.Memory.Span; + } + } + } + } + + [Benchmark(InnerIterationCount = InnerCount)] + public static void SpanFromObjectMemoryManager() + { + object o1 = new object(); + object o2 = new object(); + object[] a = { o1, o2 }; + var memory = new Memory<object>(a); + MemoryManager<object> manager = new CustomMemoryForTest<object>(a); + + foreach (BenchmarkIteration iteration in Benchmark.Iterations) + { + using (iteration.StartMeasurement()) + { + for (int i = 0; i < Benchmark.InnerIterationCount; i++) + { + Span<object> span = manager.Memory.Span; + } + } + } + } + } +} diff --git a/src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj b/src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj index edb6ffe73c..28249af672 100644 --- a/src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj +++ b/src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj @@ -10,6 +10,8 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'netcoreapp-Release|AnyCPU'" /> <ItemGroup> <Compile Include="Perf.Base64EncodeDecode.cs" /> + <Compile Include="Perf.Memory.Slice.cs" /> + <Compile Include="Perf.Memory.Span.cs" /> <Compile Include="Perf.ReadOnlySequence.Enumerator.cs" /> <Compile Include="Perf.ReadOnlySequence.First.cs" /> <Compile Include="Perf.ReadOnlySequence.GetPosition.cs" /> @@ -23,7 +25,6 @@ <Compile Include="Perf.Span.IndexOfAny.cs" /> <Compile Include="Perf.Span.SequenceCompareTo.cs" /> <Compile Include="Perf.Span.StartsWith.cs" /> - <Compile Include="Perf.MemorySlice.cs" /> <Compile Include="Perf.Utf8Formatter.cs" /> <Compile Include="Perf.Utf8Parser.cs" /> <Compile Include="..\Base64\Base64TestHelper.cs" /> diff --git a/src/System.Memory/tests/ReadOnlyMemory/Span.cs b/src/System.Memory/tests/ReadOnlyMemory/Span.cs index 50ac96ee79..728c65e2e1 100644 --- a/src/System.Memory/tests/ReadOnlyMemory/Span.cs +++ b/src/System.Memory/tests/ReadOnlyMemory/Span.cs @@ -42,6 +42,22 @@ namespace System.MemoryTests } [Fact] + public static void SpanFromCtorArrayChar() + { + char[] a = { '1', '2', '3', '4', '-' }; + ReadOnlyMemory<char> memory; + + memory = new ReadOnlyMemory<char>(a); + memory.Span.Validate('1', '2', '3', '4', '-'); + + memory = new ReadOnlyMemory<char>(a, 0, a.Length); + memory.Span.Validate('1', '2', '3', '4', '-'); + + MemoryManager<char> manager = new CustomMemoryForTest<char>(a); + ((ReadOnlyMemory<char>)manager.Memory).Span.Validate('1', '2', '3', '4', '-'); + } + + [Fact] public static void SpanFromCtorArrayObject() { object o1 = new object(); @@ -60,6 +76,19 @@ namespace System.MemoryTests } [Fact] + public static void SpanFromStringAsMemory() + { + string a = "1234-"; + ReadOnlyMemory<char> memory; + + memory = a.AsMemory(); + memory.Span.Validate('1', '2', '3', '4', '-'); + + memory = a.AsMemory(0, a.Length); + memory.Span.Validate('1', '2', '3', '4', '-'); + } + + [Fact] public static void SpanFromCtorArrayZeroLength() { int[] empty = Array.Empty<int>(); |