如何快速将数组初始化为 -1

本文关键字:初始化 数组 何快速 | 更新日期: 2023-09-27 18:34:51

我知道我不应该优化程序的每个点,让我们假设我必须优化数组初始化。

所以我写了比较for loopArray.Clear的程序

using System;
using System.Diagnostics;
namespace TestArraysClear
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[100000];
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < 10; i++)
            {
                sw.Reset(); 
                sw.Start();
                for (int j = 0; j < a.Length; j++)
                {
                    a[j] = 0;
                }
                sw.Stop();
                Console.WriteLine("for " + sw.ElapsedTicks);
                sw.Reset();
                sw.Start();
                Array.Clear(a, 0, a.Length);
                sw.Stop();
                Console.WriteLine("Array.Clear " + sw.ElapsedTicks);
            }
        }
    }
}

我的机器上的输出:

for 1166
Array.Clear 80
for 1136
Array.Clear 91
for 1350
Array.Clear 71
for 1028
Array.Clear 72
for 962
Array.Clear 54
for 1185
Array.Clear 46
for 962
Array.Clear 55
for 1091
Array.Clear 55
for 988
Array.Clear 54
for 1046
Array.Clear 55

所以Array.Clearfor loop快20倍左右。但是Array.Clear初始化为0.我可以以某种方式初始化数组以具有相同的性能-1吗?

upd:我不是在寻找一些"极端不安全"的代码。我正在寻找像Array.Clear这样简单的东西.我只是想知道 .NET 提供快速 0 初始化,但 .NET 不提供对其他值的初始化。那么为什么 .NET 更喜欢"0"而不是"-1"呢?

upd 我想重置现有的数组。所以我正在寻找Array.Clear的模拟,它将数组重置为 -1 ,而不是0

如何快速将数组初始化为 -1

可能有一种方法可以通过非托管数组(指针(将连续内存块设置为相同的值(例如,当映射到其 4 字节内存时,int '-1' 是什么(。

本文在这里讨论一种比托管 for 循环更快的方法(给出的示例是 byte[] 数组(:http://techmikael.blogspot.com/2009/12/filling-array-with-default-value.html

另外,在这里:C# 中的内存集等效于什么?

正如其他海报所提到的,这样做似乎有点极端,通常使用 for 循环初始化数组所需的速度不会成为问题。

那么,最快的方法是使用静态初始化:

int[] a = {-1, -1, -1, -1, ...}

您可以随时编写一个程序来为您生成源代码,例如

var sb = new StringBuilder("int[] a = {");
for (int i = 0; i < 10000; ++i)
    sb.append(i != 10000 -1 ? "-1," : "-1");
sb.append("};");
我不知道

它是否快,但是初始化数组的更简洁的方法.

int[] a = Enumerable.Range(0, 100000).Select(s => -1).ToArray();

更新:或者更准确地说

int[] a = Enumerable.Repeat(-1, 100000).ToArray();

没有这样的事情 - 请参阅这个问题和这个问题。

疯狂的理论 - 如果在非托管代码中实现该方法,则Clear()数组可能会更快。 但请注意@JeffMercado关于更大样本量的评论。