最快的方法来创建NumberSequence的数组

时间:2015-04-01 09:45:48

标签: c#

我想创建一个长度为X的数组,我希望以下'inteligence'

例如,如果X = 6, myArray [x] = [0,1,2,3,4,5]

目前,我做了

int[] availableIndex = new int[DestructiblesCubes.Count];
for (var i = 0; i < availableIndex.Length; i++)
{
    availableIndex[i] = i;
}

但是,我很好奇,是否有更好的(更快的执行方式)和/或更快(最短的字符长度)方式?

谢谢:)

4 个答案:

答案 0 :(得分:4)

这是实现这一目标的简短方法。不是性能最佳的解决方案。

Enumerable.Range(0, 10).ToArray()

Enumerable.Range

的MSDN说明

答案 1 :(得分:2)

我认为最快的方法使用unsafe上下文以及指向数组的正确fixed指针,如下所示:

/*const*/ int availableIndex_Length = 6;
int[] availableIndex = new int[availableIndex_Length];
unsafe {
    fixed(int* p = &availableIndex[0]) {
        for(int i = 0; i < availableIndex_Length; ++i) {
            *(p+i) = i;
        }
    } 
}

这可以重构为方法,可选inline d:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
static unsafe void FillRange(ref int[] array) {
      int length = array.Length;
      fixed(int* p = &array[0]) {
          for(int i = 0; i < length; ++i) {
              *(p + i) = i;
          }
      }
}

static void Main(string[] args) {
    // Example usage:
    int[] availableIndices = new int[6];
    FillRange(ref availableIndices);

    // Test if it worked:
    foreach(var availableIndex in availableIndices) {
        Console.WriteLine(availableIndex);
    }
    Console.ReadKey(true);
}

答案 2 :(得分:1)

我能看到的唯一适用于您的代码的优化是倒数到零,但性能的任何增加都将很小

int[] availableIndex = new int[DestructiblesCubes.Count];
for (var i = availableIndex.Length-1; i >= 0; i--)
{
    availableIndex[i] = i;
}

否则,特别是如果你在谈论大型数组时,要尝试的一件事就是创建一个大于DestructiblesCubes.Count的最大设想值的数组, 如上所述初始化该数组,然后在需要较小数组时使用Array.Copy 我相信,我们手动滚动的代码不会比单次调用Array.Copy更快。

int[] availableIndex = new int[DestructiblesCubes.Count];
Array.Copy(LargeArray, availableIndex, availableIndex.Length);

否则,我无法想到任何比你拥有的代码更快的东西。

答案 3 :(得分:1)

你可以试试这个:

unsafe
{
    int[] availableIndex = new int[DestructiblesCubes.Count];
    int length = availableIndex.Length;
    int n = 0;
    fixed(int *p = availableIndex) {
        while(n < length) *p++ = n++;
    }
}

可能更快,具体取决于编译器的优化阶段。