如何快速的将数组中的所有值赋值为一个非0数(memset类似方法)

feixinyv 2014-08-27 05:45:23
int[] array = new array[512 * 512];
for(int i = 0; i != array.Length; ++i)
{
array[i] = 10;
}

循环赋值比较慢,有没有什么方法能快速实现这段代码要做的事情?

多谢!
...全文
1890 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
杜子寒 2014-08-28
  • 打赏
  • 举报
回复

int[] array = Enumerable.Repeat<int>(10, 512 * 512).ToArray();
那这样呢
feixinyv 2014-08-28
  • 打赏
  • 举报
回复
谢谢各位,Linq表达式项目不考虑使用,GC太高了,看来确实没有类似memset的函数了……
於黾 2014-08-28
  • 打赏
  • 举报
回复
用LINQ,里面也是循环
杜子寒 2014-08-28
  • 打赏
  • 举报
回复

            int[] array = new int[512 * 512];
            array = array.Select(data => 10).ToArray();
没测试…… 不知道速度……
laviewpbt 2014-08-28
  • 打赏
  • 举报
回复
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。
threenewbee 2014-08-28
  • 打赏
  • 举报
回复
在C#中,循环是最快的,要想更快,用unsafe和指针,相比较用下标访问数组,它不会执行边界检查所以更快。
梦在旅途 2014-08-27
  • 打赏
  • 举报
回复
以下方法可以快速初始化一个非0的数组:
string[] s = "".PadRight(512 * 512, '1').ToCharArray().Select(c => c.ToString()).ToArray();

111,111

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧