Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corefx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAhson Khan <ahkha@microsoft.com>2018-04-10 08:00:13 +0300
committerGitHub <noreply@github.com>2018-04-10 08:00:13 +0300
commit1dfe097dc0201564e61461731058569a20517183 (patch)
tree19bc8eca1424040470d659ed4c8202c601be6a6a /src/System.Memory/tests
parent14f5d53b9b9badd9402a9331b9f1b8cbd30b5c85 (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.cs27
-rw-r--r--src/System.Memory/tests/Memory/Span.cs30
-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.cs166
-rw-r--r--src/System.Memory/tests/Performance/System.Memory.Performance.Tests.csproj3
-rw-r--r--src/System.Memory/tests/ReadOnlyMemory/Span.cs29
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>();