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

时间:2012-05-19 06:05:56

标签: c#

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

所以我写了一个比较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比“-1”更像“0”?

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

4 个答案:

答案 0 :(得分:5)

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

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

另外,这里: What is the equivalent of memset in C#?

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

答案 1 :(得分:2)

嗯,最快的方式是使用静态初始化:

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("};");

答案 2 :(得分:2)

我不知道它是否快速,而是一种更简洁的方法来初始化数组。

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

<强>更新 或者更确切地说是

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

答案 3 :(得分:0)

没有这样的事情 - 请参阅this questionthis one

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