C# 为什么重新分配缓冲区比重置缓冲区更快?

C# 为什么重新分配缓冲区比重置缓冲区更快?,c#,performance,buffer,C#,Performance,Buffer,在重构一些旧代码时,我决定进行一些毫无意义的过早优化,并重新利用缓冲区,而不是每次重新分配缓冲区。 令我大吃一惊的是,我发现它的速度慢得难以置信 复制: private static void Main(string[] args) { const int N = (int)1e4; const int size = 100 * 1024; var sw = Stopwatch.StartNew(); var bu

在重构一些旧代码时,我决定进行一些毫无意义的过早优化,并重新利用缓冲区,而不是每次重新分配缓冲区。 令我大吃一惊的是,我发现它的速度慢得难以置信

复制:

    private static void Main(string[] args)
    {
        const int N = (int)1e4;
        const int size = 100 * 1024;

        var sw = Stopwatch.StartNew();
        var buffer = new byte[size];
        for (int n = 0; n < N; n++)
        {
            buffer = new byte[size];
        }
        var reallocMs = sw.ElapsedMilliseconds;

        sw = Stopwatch.StartNew();
        buffer = new byte[size];
        for (int n = 0; n < N; n++)
        {
            for (int i = 0; i < buffer.Length; i++)
            {
                buffer[i] = 0;
            }
        }
        var rewriteMs = sw.ElapsedMilliseconds;

        Console.WriteLine($"Reallocating: {reallocMs} ms");
        Console.WriteLine($"Rewriting: {rewriteMs} ms");

        Console.WriteLine($"Rewrite / reallocate = {(double)rewriteMs / (double)reallocMs}");
    }
private static void Main(字符串[]args)
{
常数int N=(int)1e4;
常数int size=100*1024;
var sw=Stopwatch.StartNew();
var buffer=新字节[大小];
对于(int n=0;n
内置
释放时
,重写每个字节的速度比重新分配新缓冲区慢约8倍。在
Debug
中,速度几乎降低了50倍

这怎么可能?我原以为有一个固定的缓冲区会提高性能,但事实显然并非如此

我错过了什么


p.S:顺便说一句,
Array.Clear()
始终比for循环慢,尽管它的性能与构建配置无关。

每次写入数组时,它都可能引发异常。因此,在每次循环中写入实现中,都会对索引进行边界检查。这可以在初始化已知范围的内存时进行优化。

你是在问为什么执行单个内存操作要比执行数千个内存操作快得多?如果你这样说的话。。。比方说,我感到惊讶的是,不断地寻找一个新的空闲区域,保留它,并为垃圾收集器创建数千个对象的开销实际上比一次找到一个区域并重置其值要快。