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

Array.ForEach()与C#中的标准for循环相比如何?,c#,.net,performance,C#,.net,Performance,作为一名C程序员,我渴望能够键入以下内容: memset( byte_array, '0xFF' ); 并获取一个填充有“FF”字符的字节数组。因此,我一直在寻找替代品: for (int i=0; i < byteArray.Length; i++) { byteArray[i] = 0xFF; } for(int i=0;ib=0xFF); 诚然,第二种方法看起来更干净、更美观,但与第一种方法相比,性能如何?我是否通过使用Linq和泛型引入了不必要的开销 谢谢, Dave

作为一名C程序员,我渴望能够键入以下内容:

memset( byte_array, '0xFF' );
并获取一个填充有“FF”字符的字节数组。因此,我一直在寻找替代品:

for (int i=0; i < byteArray.Length; i++)
{
    byteArray[i] = 0xFF;
}
for(int i=0;i
最近,我一直在使用一些新的C#功能,并一直在使用这种方法:

Array.ForEach<byte>(byteArray, b => b = 0xFF);
Array.ForEach(byteArray,b=>b=0xFF);
诚然,第二种方法看起来更干净、更美观,但与第一种方法相比,性能如何?我是否通过使用Linq和泛型引入了不必要的开销

谢谢,
Dave

除非您在非常关键的性能操作期间执行此操作,否则不会出现问题。关于foreach调用和索引迭代,有很多基准测试,差别很小


当然,您可以自己对其进行基准测试…

我认为泛型永远不会对性能造成损害。它们主要在编译时处理,其一般目的是消除在对象和所需类型之间进行强制转换的需要,这在最坏的情况下会产生微不足道的影响,在最好的情况下会产生可测量的性能增益

就LINQ而言,我不确定它会对性能产生什么影响


但最终,初始化是一项很小的任务,性能影响将不值得您关注。

第二种方法使用委托来设置每个字节,这意味着数组中的每个字节都有一个方法调用。仅仅设置一个字节就需要很大的开销

另一方面,编译器很好地优化了普通循环。它将确定索引不能在数组之外,因此将跳过边界检查

澄清一下:您根本没有使用LINQ。ForEach方法是Array类中的一个方法,它早于LINQ的添加

Array.ForEach<byte>(byteArray, b => b = 0xFF);
初始化数组的步骤

重复肯定会比for循环慢。根据CAbbott在评论中发布的链接,在一个包含100多万个项目的阵列上,速度大约慢10.5秒(12.38秒vs 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);
public static T[]GetPreFilledArray(T fillItem,int count)
{
var结果=新的T[计数];
for(int i=0;i

这应该是一个很快的选择,因为这基本上就是您现在正在做的。

是我想要memset/memcpy类型行为时倾向于使用的。我会测量性能并使用类似反射器的东西。可能是语言在内部调用了内置类,而这些类又是围绕MEMCPY和MEMSET的精简包装。

我发现Array.ForEach比for或ForEach循环要慢得多,如果它们位于关键执行路径中的话。但是,除非您是一名框架/库开发人员,或者实际上需要初始化数百万个阵列,否则我根本不会担心性能问题。很可能,通过在其他地方进行优化,您可以获得更多

如果你像卡博特提到的发布问题的人一样关注绩效,你可能想看看。

在第二种方法中,你不使用LINQ。LINQ没有
ForEach
方法。您正在使用数组类中的静态方法:
Array.ForEach
。lambda表达式是委托的语法糖,不算作LINQ。感谢大家的回复。我学到了一些东西,希望其他人也能学到一些东西。我真的应该在发布之前尝试一下我写的代码。当然,您是正确的,ForEach循环将不起作用,而Enumerable.Repeat的作用非常好。它没有回答我关于性能问题的问题,但绝对是一个很好的信息……经过再三思考,它确实回答了这个问题——您解释了这两种方法如何相互比较,并提供了另一种选择。你得到这一次的分数。。。
  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);