Dav*_*N59 5 .net c# performance
作为一名C程序员,我可以输入:
memset( byte_array, '0xFF' );
Run Code Online (Sandbox Code Playgroud)
并获得一个填充'FF'字符的字节数组.所以,我一直在寻找替代品:
for (int i=0; i < byteArray.Length; i++)
{
byteArray[i] = 0xFF;
}
Run Code Online (Sandbox Code Playgroud)
最近,我一直在使用一些新的C#功能,并且一直在使用这种方法:
Array.ForEach<byte>(byteArray, b => b = 0xFF);
Run Code Online (Sandbox Code Playgroud)
当然,第二种方法似乎更清晰,更容易看到,但性能与使用第一种方法相比如何呢?我是否通过使用Linq和泛型来引入不必要的开销?
谢谢,戴夫
Array.ForEach<byte>(byteArray, b => b = 0xFF);
Run Code Online (Sandbox Code Playgroud)
这没有任何作用.它将每个字节的副本设置为0xFF,它永远不会在数组中设置.
为了更简单的方法,您可以尝试
Enumerable.Repeat((byte)0xFF, someCount).ToArray();
Run Code Online (Sandbox Code Playgroud)
初始化你的数组
重复肯定会慢于你的for循环.根据CAbbott在评论中发布的链接,在一个拥有超过一百万个项目的阵列上,它慢了大约10.5秒(12.38对1.7),但如果你只用一小部分做了几次就没有太大的区别阵列.
您可以编写一个比Repeat和ToArray更快的简单方法,因为在开始填充数组之前可以知道数组的长度.
public static T[] GetPreFilledArray<T>(T fillItem, int count)
{
var result = new T[count];
for(int i =0; i < count; i++)
{
result[i] = fillItem;
}
return result;
}
byte[] byteArray = GetPreFilledArray((byte)0xFF, 1000);
Run Code Online (Sandbox Code Playgroud)
这应该是一个非常快速的选择,因为它基本上就是你现在正在做的事情.