zoukankan      html  css  js  c++  java
  • c#使用foreach需要知道的

        在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,性能上也和for没有多大的差别;那为什么还要注意呢?我们先下来看下以下这句话:分配的内存数量和完成测试所需的时间之间有直接关系。当我们单独查看的时候,内存分配并不是非常昂贵。但是,当内存系统只是偶尔清理不使用的内存时,问题就出现了,并且问题出现的频率和要分配的内存数量成正比。因此,你分配越多的内存,对内存进行垃圾回收的频率就越频繁,你的代码性能就会变得越差。

        从上面那些话可以看到内存的回收是非常损耗资源,那我们再看下一些.net内部类型的实现。

    Array:

    // System.Array
    public IEnumerator GetEnumerator()
    {
    	int lowerBound = this.GetLowerBound(0);
    	if (this.Rank == 1 && lowerBound == 0)
    	{
    		return new Array.SZArrayEnumerator(this);
    	}
    	return new Array.ArrayEnumerator(this, lowerBound, this.Length);
    }
    List<T>:
    // System.Collections.Generic.List<T>
    public List<T>.Enumerator GetEnumerator()
    {
    	return new List<T>.Enumerator(this);
    }
     
    Dictionary<TKey, TValue>:
    // System.Collections.Generic.Dictionary<TKey, TValue>
    public Dictionary<TKey, TValue>.Enumerator GetEnumerator()
    {
    	return new Dictionary<TKey, TValue>.Enumerator(this, 2);
    }
    从以上代码来看,我们再进行foreach操作以上对象的时候都会构建一个Enumerator;也许有人会认为这点东西不需要计较,不过的确很多情况是不用关心;但如果通过内存分析到到的结果表明构建Enumerator的数量排在前几位,那就真的要关心一下了。很简单的一个应用假设你的应用要处理几W的并发,而每次都存在几次foreach那你就能计算出有多少对象的产生和回收?看下一个简单的分析图,这里紧紧是存在一个List'1如果组件内部每个并发多几个foreach又会怎样?

    改成for的结果又怎样呢

    访问Beetlex的Github
  • 相关阅读:
    BeautifulSoup的基本用法
    打印实例
    webservice和一般处理程序
    C# 后台调用存储过程
    表格增加删除
    asp.net C# 获得配置文件AppSettings 的值
    深入浅出zookeeper(一)
    resource下的excel文件下载被损害
    csdn添加目录
    spring面试题,求求你别问我spring了!
  • 原文地址:https://www.cnblogs.com/smark/p/2389217.html
Copyright © 2011-2022 走看看