Skip to content

Instantly share code, notes, and snippets.

@akiraKido
Last active September 27, 2019 18:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akiraKido/6c2fcaed20ff86663025815ca782a8f9 to your computer and use it in GitHub Desktop.
Save akiraKido/6c2fcaed20ff86663025815ca782a8f9 to your computer and use it in GitHub Desktop.
Span Memmove Benchmark
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
public class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run<Program>();
}
[Benchmark]
public void ArrayCopy()
{
var array1 = "this is a test".ToCharArray();
var array2 = new char[array1.Length];
Array.Copy(array1, 0, array2, 0, array1.Length);
}
[Benchmark]
public void BufferBlockCopy()
{
var array1 = "this is a test".ToCharArray();
var array2 = new char[array1.Length];
Buffer.BlockCopy(array1, 0, array2, 0, array1.Length);
}
[Benchmark]
public void SpanCopy()
{
var array1 = "this is a test".AsSpan();
var array2 = new char[array1.Length].AsSpan();
Span.Copy(array1, 0, array2, 0, array1.Length);
}
[Benchmark]
public void SpanCopyStackAlloc()
{
var array1 = "this is a test".AsSpan();
Span<char> array2 = stackalloc char[array1.Length];
Span.Copy(array1, 0, array2, 0, array1.Length);
}
}
public static class Span
{
public static void Copy<T>(ReadOnlySpan<T> src, int sStart, Span<T> dest, int dStart, int len)
{
if (dest.Length < src.Length)
{
int i = 0;
while (len-- > 0 && dStart + i < dest.Length)
{
dest[dStart + i] = src[sStart + i];
i += 1;
}
}
else
{
int lastS = sStart + (len - 1);
int lastD = dStart + (len - 1);
int i = 0;
while (len-- > 0)
{
dest[lastD - i] = src[lastS - i];
i += 1;
}
}
}
}
@akiraKido
Copy link
Author

akiraKido commented Sep 27, 2019

.NET Core 2.1

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
[Host] : .NET Core 2.1.12 (CoreCLR 4.6.27817.01, CoreFX 4.6.27818.01), 64bit RyuJIT
DefaultJob : .NET Core 2.1.12 (CoreCLR 4.6.27817.01, CoreFX 4.6.27818.01), 64bit RyuJIT

Method Mean Error StdDev
ArrayCopy 22.71 ns 0.1647 ns 0.1375 ns
BufferBlockCopy 23.02 ns 0.5288 ns 1.5591 ns
SpanCopy 28.11 ns 0.7507 ns 1.0766 ns
SpanCopyStackAlloc 24.64 ns 0.5107 ns 0.5015 ns

@akiraKido
Copy link
Author

.NET Core 3.0

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
[Host] : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT

Method Mean Error StdDev
ArrayCopy 22.38 ns 0.4569 ns 0.5940 ns
BufferBlockCopy 20.06 ns 0.1306 ns 0.1222 ns
SpanCopy 19.95 ns 0.3644 ns 0.3043 ns
SpanCopyStackAlloc 23.81 ns 0.1139 ns 0.1065 ns

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment