Array.ForEach()与C#中的循环标准相比如何?

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和泛型来引入不必要的开销?

谢谢,戴夫

Mik*_*ike 7

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)

这应该是一个非常快速的选择,因为它基本上就是你现在正在做的事情.