【发布时间】:2020-05-23 10:08:03
【问题描述】:
我正在测试使用标准 C# 数组与使用内存缓冲区的性能。标准阵列获胜。我不明白标准数组如何比使用内存缓冲区中的跨度更快。文档说内存缓冲区应该用于高性能场景。我正在使用 Release 优化配置。
class Program
{
private static void MemoryPoolTest(IMemoryOwner<long> owner)
{
for (var i = 0; i < 100; i++)
{
var innerCounter = 0;
for (var j = 0; j < 1000; j++)
{
if (j % 3 == 0)
{
owner.Memory.Span[innerCounter++] = DateTime.UtcNow.Ticks;
}
}
var result = owner.Memory.Slice(0, innerCounter - 1);
}
}
private static void ArrayTest()
{
for (var i = 0; i < 100; i++)
{
var innerCounter = 0;
Span<long> array = new long[1000];
for (var j = 0; j < 1000; j++)
{
if (j % 3 == 0)
{
array[innerCounter++] = DateTime.UtcNow.Ticks;
}
}
var result = array.Slice(0, innerCounter - 1);
}
}
static void Main(string[] args)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
var m = new List<long>();
var a = new List<long>();
var sw = new Stopwatch();
using var owner = MemoryPool<long>.Shared.Rent(1000);
for (var i = 0; i < 1000; i++)
{
sw.Restart();
MemoryPoolTest(owner);
sw.Stop();
m.Add(sw.ElapsedTicks);
sw.Restart();
ArrayTest();
sw.Stop();
a.Add(sw.ElapsedTicks);
}
Console.WriteLine(m.Skip(10).Average());
Console.WriteLine(a.Skip(10).Average());
}
}
【问题讨论】:
-
我每天看到大约 3 个“为什么这么慢” 问题。他们通常会分解为不正确的基准测试方法,或者试图将苹果与橘子竞争。对于初学者来说,它不是数组与内存。并且您正在调用 memory.Span 每次迭代,这是相当密集的。但是,您仍在与苹果和橘子赛跑。
-
是的,除了在这种情况下,它是可以轻松优化的糟糕代码;)
标签: c# .net performance memory-management .net-core