我想创建一个长度为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;
}
但是,我很好奇,是否有更好的(更快的执行方式)和/或更快(最短的字符长度)方式?
谢谢:)
答案 0 :(得分:4)
答案 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++;
}
}
可能更快,具体取决于编译器的优化阶段。