for vs foreach

原文地址:http://jacksondunstan.com/articles/3165

正文:

foreach循环非常好使,但是for循环更快?这是个简单的问题,但是却在很多代码里有广泛的影响。本文测试了for和foreach,看看用两者遍历一个数组和list到底谁快。

测试很简单,我做了一个object数组,和一个object的System.Collections.Generic.List,它们长度确定,分别使用for和foreach循环遍历。因为循环小于1毫秒,所以每个循环运行100000次。
测试代码:

using System;
using System.Collections.Generic;

using UnityEngine;

public class TestScript : MonoBehaviour
{
    private const int NumIterations = 100000;

    private string report;

    void Start()
    {
        report = "Size,Array For Time,Array Foreach Time,List For Time,List Foreach Time\n";
        var sizes = new []{10,100,1000};
        foreach (var size in sizes)
        {
            report += Test(size);
        }
    }

    private string Test(int size)
    {
        var array = new object[size];
        var list = new List<object>(size);
        list.AddRange(array);
        var stopwatch = new System.Diagnostics.Stopwatch();
        object obj = null;

        stopwatch.Reset();
        stopwatch.Start();
        for (var iteration = 0; iteration < NumIterations; ++iteration)
        {
            for (int i = 0, len = array.Length; i < len; ++i)
            {
                obj = array[i];
            }
        }
        var arrayForTime = stopwatch.ElapsedMilliseconds;

        stopwatch.Reset();
        stopwatch.Start();
        for (var iteration = 0; iteration < NumIterations; ++iteration)
        {
            foreach (var cur in array)
            {
            }
        }
        var arrayForeachTime = stopwatch.ElapsedMilliseconds;

        stopwatch.Reset();
        stopwatch.Start();
        for (var iteration = 0; iteration < NumIterations; ++iteration)
        {
            for (int i = 0, len = list.Count; i < len; ++i)
            {
                obj = list[i];
            }
        }
        var listForTime = stopwatch.ElapsedMilliseconds;

        stopwatch.Reset();
        stopwatch.Start();
        for (var iteration = 0; iteration < NumIterations; ++iteration)
        {
            foreach (var cur in list)
            {
            }
        }
        var listForeachTime = stopwatch.ElapsedMilliseconds;

        return size + ","
            + arrayForTime + ","
            + arrayForeachTime + ","
            + listForTime + ","
            + listForeachTime + "\n";
    }

    void OnGUI()
    {
        GUI.TextArea(new Rect(0, 0, Screen.width, Screen.height), report);
    }
}

如果你自己想试试,可以把代码复制到TestScript.cs文件,把这个文件放到Unity的Assets文件夹下,附加到摄像机对象上,然后在64位处理器的non-development模式下构建,并运行在640*480的窗口模式下。
我测试的机器配置:

  • 2.3 Ghz Intel Core i7-3615QM •Mac OS X 10.10.4
  • Unity 5.1.2f1, Mac
  • OS X Standalone, x86_64, non-development
  • 640×480, Fastest, Windowed
    下面是我得到的测试结果:
sizefor遍历数组foreach遍历数组for遍历listforeach遍历list
1021319
10028103595
100024375343832

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

结论是,对数组来说,foreach比for要快。对于List,for循环比较快。当你循环一个很长的数组或者list的时候得注意点,但是注意这个测试循环了100000次,所以实际差别会小很多。遍历一百万个元素的list大概会花费8毫秒,在这个情况下用for循环会更好的优化,想要继续优化,可以参考这个文章(不安全的代码循环)。
综上所述,for和foreach遍历速度有差别,而且依赖于你要遍历啥。两者速度都很快,在你的app里可能他们的速度差别没那么大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值