技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营
卡卡网是专业的网站测速平台,网速测试,测试网站速度,就来卡卡网 ~
问题反馈网络日志

【DiyVM】沙田机房/香港云/回国CN2线路/AMD EPYC/39元一月5M/CN2海外云主机 24元/月BGP+CN2海外云 低至25元/月海外主机 低至$2/月

DiyVM:香港VPS惊爆价36元一月
★站长变现★特色悬浮小图标广告
5M CN2 GIA云主机 24元起
【转化好产品,官方高价收量】
一一一云主机 26元起一一一
官方高价收量,每日稳定结算

一一云主机 24元 3折起一一
AWS核心代理U充值 免注册开户
海外CN2云 低至$2.5/月
海外云低至2折 298/年
免费测试★APK免杀 谷歌过保护
官方收量CPA/CPS长期稳定

海外主机 5M CN2 低至$2/月
恒创科技 一 海外服务器 ● 高速稳定
★解决安装报毒★谷歌过保护机制
CN2 GIA/1000Mbps $111/月
超级签★免杀★加固★满意付款
全球云主机 3天试用再买

【菠萝云】香港4G内存99元,马上开通
亿人互联-津/京BGP托管租用/VPS
苹果签名/APP封装/远控免杀
10M CN2海外云VPS 53元/月
一一站长/主播好变现一一有流量就来
站长变现 特色悬浮小图标广告

实力产品变现
实力产品变现
实力产品变现
实力产品变现
实力产品变现
实力产品变现

赞助商

分类目录

赞助商

最新文章

Windows 2012 不默认安装 .NET 3.5,需要此环境的人要手动添加...
在本文中,我将介绍如何在 .NET 中美化 JSON 字符串。
asp.net 的 @OutputCache 是以声明方式控制 ASP.NET ...
在本教程中,您将了解 System.IO,它是一个 C# 命名空间。此命名空间提...
在本文中,我将介绍C#如何清理JSON字符串里的HTML标签,同时把双引号变为单...
== 运算符和 Equals() 方法都用于比较两个值类型数据项或引用类型数据项...
为了比较变量之间的相等性,C# 提供了两种比较方法“==&rdquo...

搜索

asp.net(c#) foreach和for速度比较

作者:admin    时间:2022-7-4 17:8:28    浏览:1047

asp.net(c#)中foreach和for循环的性能差异表现在它们的速度快慢上,在这篇文章中,我们探讨一下这两者的细微差异。

asp.net(c#) foreach和for速度比较 

让我们看一下下面的代码:

  1. foreach (var item in Enumerable.Range(0, 128))
  2. {
  3.   Console.WriteLine(item);
  4. }

foreach 在编译器中会被转换为以下代码:

  1. IEnumerator<int> enumerator = Enumerable.Range(0, 128).GetEnumerator();
  2. try
  3.  {
  4.    while (enumerator.MoveNext())
  5.    {
  6.      int item = enumerator.Current;
  7.      Console.WriteLine(item);
  8.    }
  9.  }
  10. finally
  11.  {
  12.   if (enumerator != null)
  13.   {
  14.    enumerator.Dispose();
  15.   }
  16. }

可以看到,foreach执行的整个过程:

  • 创建一个新对象,它被称为Creator
  • 每次迭代都会调用 MoveNext 方法。
  • 每次迭代都会访问 Current 属性。

不过,它并不像听起来那么容易。

C#/CLR 可能会在运行时执行优化,使代码运行得更快。

数组是一种深度集成到 CLR 中的类型,CLR 为这种类型提供了许多优化。FOREACH 循环是一个可迭代的实体,这是性能的一个关键方面。在本文后面,我们将讨论如何在 Array.ForEach 静态方法和 List.ForEach 方法的帮助下遍历数组和列表。

测试方法

  1. static double ArrayForWithoutOptimization(int[] array)
  2. {
  3.    int sum = 0;
  4.    var watch = Stopwatch.StartNew();
  5.    for (int i = 0; i < array.Length; i++)
  6.      sum += array[i];
  7.     watch.Stop();
  8.     return watch.Elapsed.TotalMilliseconds;
  9. }
  10.  
  11. static double ArrayForWithOptimization(int[] array)
  12. {
  13.    int length = array.Length;
  14.    int sum = 0;
  15.    var watch = Stopwatch.StartNew();
  16.     for (int i = 0; i < length; i++)
  17.       sum += array[i];
  18.     watch.Stop();
  19.      return watch.Elapsed.TotalMilliseconds;
  20. }
  21.  
  22. static double ArrayForeach(int[] array)
  23. {
  24.   int sum = 0;
  25.   var watch = Stopwatch.StartNew();
  26.    foreach (var item in array)
  27.     sum += item;
  28.   watch.Stop();
  29.   return watch.Elapsed.TotalMilliseconds;
  30. }
  31.  
  32. static double ArrayForEach(int[] array)
  33. {
  34.   int sum = 0;
  35.   var watch = Stopwatch.StartNew();
  36.   Array.ForEach(array, i => { sum += i; });
  37.   watch.Stop();
  38.   return watch.Elapsed.TotalMilliseconds;
  39. }

测试条件:

  • “优化代码”选项已打开。
  • 元素的数量等于 100 000 000(在数组和列表中)。
  • PC 规格:Intel Core i-5 和 8 GB RAM。

数组

 

该图显示 FORFOREACH 在遍历数组时花费相同的时间。也是因为CLR优化将FOREACH转换为FOR,并以数组的长度作为最大迭代边界。不管数组长度是否缓存(使用FOR时),结果都差不多。

听起来可能很奇怪,但是缓存数组长度可能会影响性能。在使用Array.Length 作为迭代边界时,JIT 测试索引是否命中循环之外的右边界。此检查仅执行一次。

破坏这种优化非常容易。缓存变量的情况几乎没有优化。

Array.foreach展示了最差的结果。它的实现非常简单: 

  1. public static void ForEach<T>(T[] array, Action<T> action)
  2.  {
  3.   for (int index = 0; index < array.Length; ++index)
  4.     action(array[index]);
  5.  }

那为什么它运行这么慢?它在引擎盖下使用 FOR。原因在于调用 ACTION 委托。事实上,每次迭代都会调用一个方法,这会降低性能。此外,委托的调用速度没有我们希望的那么快。

列表

 

结果完全不同。迭代列表时,FORFOREACH 显示不同的结果。没有优化。FOR(缓存列表长度)显示最佳结果,而 FOREACH 慢 2 倍以上。这是因为它在后台处理 MoveNextCurrentList.ForEachArray.ForEach 显示最差的结果。代表总是被虚拟调用。此方法的实现如下所示:

  1. public void ForEach(Action<T> action)
  2. {
  3.   int num = this._version;
  4.    for (int index = 0; index < this._size && num == this._version; ++index)
  5.      action(this._items[index]);
  6.    if (num == this._version)
  7.      return;
  8.    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
  9. }

每次迭代都会调用 Action 委托。它还检查列表是否更改,如果更改,则抛出异常。

List 内部使用基于数组的模型,而 ForEach 方法使用数组索引进行迭代,这比使用索引器快得多。 

 

x

具体数字

  1. 没有长度缓存的 FOR 循环和 FOREACH 在数组上的工作比使用长度缓存的 FOR 稍快。
  2. Foreach 性能 比 FOR / FOREACH 性能慢大约 6 倍。
  3. 与数组相比,没有长度缓存的 FOR 循环在列表上的运行速度要慢 3 倍。
  4. 与数组相比,具有长度缓存的 FOR 循环在列表上的运行速度要慢 2 倍。
  5. 与数组相比,FOREACH 循环在列表上的运行速度要慢 6 倍。

这是列表的排行榜: 

 

对于数组:

 

结论

事实证明,FOREACH 在数组上比 FOR 的长度追踪更快。在列表结构上,FOREACHFOR 慢。

使用 FOREACH 时代码看起来更好,并且现代处理器允许使用它。但是,如果你需要高度优化你的代码库,最好使用 FOR

文章推荐

标签: foreach  for  
x
广告: 【限时】云主机 24元/月