怎么快速的将数组中的所有值赋值为一个非0数(memset类似方法)
如何快速的将数组中的所有值赋值为一个非0数(memset类似方法)
int[] array = new array[512 * 512];
for(int i = 0; i != array.Length; ++i)
{
array[i] = 10;
}
循环赋值比较慢,有没有什么方法能快速实现这段代码要做的事情?
多谢!
------解决方案--------------------
以下方法可以快速初始化一个非0的数组:
------解决方案--------------------
在C#中,循环是最快的,要想更快,用unsafe和指针,相比较用下标访问数组,它不会执行边界检查所以更快。
------解决方案--------------------
没测试…… 不知道速度……
------解决方案--------------------
用LINQ,里面也是循环
------解决方案--------------------
那这样呢
------解决方案--------------------
memset本来就只能将每个字节填充为一样的。你这种int类型无法使用memset的。
memset可以对应API函数FillMemory。
像你这样的512*512的数组 初始化耗时在现代CPU基本可以忽略。 我这里给你一个用内存拷贝的快速方式 。
其中CopyMemory的原型为:
[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = true)]
internal static extern void CopyMemory(void * Dest, void * src, int Length);
我测试了5000* 5000的int数组,你那种写法时间在100ms左右,上面的约50ms。
int[] array = new array[512 * 512];
for(int i = 0; i != array.Length; ++i)
{
array[i] = 10;
}
循环赋值比较慢,有没有什么方法能快速实现这段代码要做的事情?
多谢!
------解决方案--------------------
以下方法可以快速初始化一个非0的数组:
string[] s = "".PadRight(512 * 512, '1').ToCharArray().Select(c => c.ToString()).ToArray();
------解决方案--------------------
在C#中,循环是最快的,要想更快,用unsafe和指针,相比较用下标访问数组,它不会执行边界检查所以更快。
------解决方案--------------------
int[] array = new int[512 * 512];
array = array.Select(data => 10).ToArray();
没测试…… 不知道速度……
------解决方案--------------------
用LINQ,里面也是循环
------解决方案--------------------
int[] array = Enumerable.Repeat<int>(10, 512 * 512).ToArray();
那这样呢
------解决方案--------------------
memset本来就只能将每个字节填充为一样的。你这种int类型无法使用memset的。
memset可以对应API函数FillMemory。
像你这样的512*512的数组 初始化耗时在现代CPU基本可以忽略。 我这里给你一个用内存拷贝的快速方式 。
int Index = 1;
array[0] = 10;
fixed (int* Src = array)
{
while ((array.Length) > (1 << Index))
{
CopyMemory(Src + (1 << (Index - 1)), Src, (1 << (Index - 1)) * sizeof(int));
Index++;
}
Index--;
CopyMemory(Src + (1 << Index), Src, (array.Length - (1 << Index)) * sizeof(int));
}
其中CopyMemory的原型为:
[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = true)]
internal static extern void CopyMemory(void * Dest, void * src, int Length);
我测试了5000* 5000的int数组,你那种写法时间在100ms左右,上面的约50ms。