3

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

所以我写了比较for loop的程序Array.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.Clear大约比 . 快 20 倍for loop。但Array.Clear初始化为0. 我可以以-1某种方式将数组初始化为具有相同的性能吗?

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

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

4

4 回答 4

6

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

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

另外,这里: 什么是 C# 中的 memset 等价物?

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

于 2012-05-19T06:44:23.373 回答
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("};");
于 2012-05-19T06:10:34.863 回答
2

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

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

更新: 或更准确地说

int[] a = Enumerable.Repeat(-1, 100000).ToArray();
于 2012-05-19T08:03:28.113 回答
0

没有这样的事情 - 看到这个问题这个问题。

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

于 2012-05-19T06:10:46.437 回答