C#性能,内存缓冲区的数组与跨度

问题描述 投票:1回答:1

我正在测试使用标准C#阵列与使用内存缓冲区的性能。标准阵列获胜。我不知道标准数组比使用内存缓冲区的跨度更快。该文档说应该在高性能方案中使用内存缓冲区。我正在使用发布优化配置。

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());
    }
}
c# .net performance memory-management .net-core
1个回答
0
投票
这取决于具体的CPU,但是堆通常是从CPU内部的小内存(有时称为缓存)中使用的,今天,每个内核最多可使用1MB或2MB,这是非常快的,而分配了托管内存在常规RAM中。也可以缓存,但可能性不大。
© www.soinside.com 2019 - 2024. All rights reserved.