|
|
1
64
这对于小型阵列是可以的,但是如果您处理的是非常大的阵列,并且性能是一个问题,那么应该使用循环方法。 |
|
|
2
52
实际上,很少有人知道IL操作叫做 Initblk English version )正是这样。因此,让我们将其用作一种不需要“不安全”的方法。以下是helper类:
表演怎么样?下面是我对Windows/.NET和Linux/Mono(不同的PC)的结果。
所以这是值得考虑的。请注意,生成的IL将不可验证。 |
|
|
3
23
建立在
Lucero's answer
,这是一个更快的版本。它将使用复制的字节数增加一倍
|
|
|
4
22
|
|
|
5
13
这个简单的实现使用了连续加倍,并且执行得非常好(根据我的基准测试,大约比naive版本快3-4倍):
编辑:在阅读其他答案后,似乎我不是唯一一个有这个想法的人。尽管如此,我还是把它留在这里,因为它有点干净,而且和其他人一样。 |
|
|
6
12
如果性能很重要,您可以考虑使用不安全代码并直接使用指向数组的指针。 另一个选项是从msvcrt.dll导入memset并使用它。然而,调用它的开销可能很容易大于速度上的增益。 |
|
|
7
12
要填充数组的代码如下所示:
|
|
|
8
9
|
|
|
9
8
如果性能是绝对关键的,那么
|
|
|
10
6
所有答案都只写单个字节-如果要用单词填充字节数组怎么办?还是浮动?我时不时地发现它的用处。因此,在以非泛型的方式编写了几次类似于“memset”的代码并在本页找到了单字节的好代码之后,我开始编写下面的方法。 我认为PInvoke和C++/CLI各有缺点。为什么不让运行时“PInvoke”进入mscorxxx?Array.Copy和Buffer.BlockCopy当然是本机代码。BlockCopy甚至不是“安全的”-您可以复制一个长文件,复制到另一个文件的一半,或者复制到一个日期时间,只要它们在数组中。 至少我不会为这样的事情提交新的C++项目——这几乎是浪费时间。
有了此功能,您只需添加简短的方法,以获取需要使用的值类型并调用私有方法,例如,只需在此方法中查找replace ulong:
或者愚蠢地使用任何类型的结构(尽管上面的MemsetPrivate只适用于封送到二次幂大小的结构):
尽管如此,我还是将性能写入与for、initblk和memset方法进行了比较。时间以毫秒为单位,超过100次重复写入8字节Ulong,无论多少次符合缓冲区长度。for版本是针对单个ulong的8个字节手动展开循环的。
如果有人想优化这个,那就真的去吧。这是可能的。 |
|
|
11
4
|
|
|
12
3
|
|
|
13
2
随着
|
|
|
14
1
.NET Core有一个内置的Array.Fill()函数,但遗憾的是.NET Framework缺少它。NETCORE有两种变体:填充整个数组和从索引开始填充数组的一部分。 在上述思想的基础上,这里有一个更通用的Fill函数,它将填充多个数据类型的整个数组。与本文讨论的其他方法进行基准测试时,这是最快的功能。 此函数以及填充阵列一部分的版本在开源和免费的NuGet包中提供( HPCsharp on nuget.org ). 还包括使用SIMD/SSE指令的稍快版本的Fill,该指令仅执行内存写入,而基于块拷贝的方法执行内存读取和写入。
|
|
|
15
0
大多数答案都是针对byte memset的,但若要将其用于float或任何其他结构,则应将index乘以数据的大小。因为Buffer.BlockCopy将基于字节进行复制。 此代码适用于浮点值
|
|
|
16
-1
数组对象有一个名为Clear的方法。我敢打赌Clear方法比用C#编写的任何代码都要快。 |