zoukankan      html  css  js  c++  java
  • PowerCollections研究: 第1弹竟就发现不少问题

    昨天刚说了PowerCollections强大,今天就这么随手拿来一看发现不少问题,不光是设计,还有效率方面的.
    (PS: PowerCollections是从<<CLR Via C#>>中看到的,Jeff说其的BigList在count>100的时候有更优秀的效率,而且里面提供了很多丰富的集合类.)

    public abstract class CollectionBase<T> : ICollection<T>, ICollection
    {
        
    public virtual void CopyTo(T[] array, int arrayIndex)
        
    {
            
    // code 1
        }


        
    void ICollection.CopyTo(Array array, int index)
        
    {
            
    // code 2
        }

    }

    code 1 跟code 2的代码完全一样,足有10多行重复代码,不知其是Copy&Parse 还是重新写了一遍,汗!
    既然有了一个CopyTo的方法,并且标明为virtual ,可被子类覆盖了,为什么还要显示实现ICollection.CopyTo, 再汗!

    public abstract class ListBase<T> : CollectionBase<T>, IList<T>, IList
    {
        
    public override void CopyTo(T[] array, int arrayIndex)
        
    {
            
    base.CopyTo(array, arrayIndex);
        }

    }

    ListBase.CopyTo()啥事也没干,却又override一遍,这不摆明徒增开销嘛,继续汗!
    再来看看CopyTo的代码,一看再吃一惊竟然是用foreach循环+set Arrary做的,这样的效率能忍受吗?

    public virtual void CopyTo(T[] array, int arrayIndex)
    {
        
    //  check parameters
        int i = 0;
        
    foreach (object o in (ICollection)this)
        
    {
            
    if (i >= count)
                
    break;

            array.SetValue(o, index);
            
    ++index;
            
    ++i;
        }

    }

    我们看看FCL中的List<T>.CopyTo()怎么做的.

    public void CopyTo(T[] array, int arrayIndex)
    {
        Array.Copy(this._items, 0, array, arrayIndex, this._size);
    }
    Arry.Copy不知道多少人熟习,里面究竟是怎么实现的我是看不太懂,但效率是没话说滴.

    自己测试了一下在集合count = 1000000,循环100次测试结果如下
    Debuge 结果:

    image

    Release结果:

    image

    BigList在Debug跟Release下表现的性能差别很大,不知是什么原因(BigLsit<T>继承自ListBase<T>,因此其调用CollectionBase<T>.CopyTo()需要查两次Method Table,在Debug下应该要记录下调试信息,不好优化可能慢一点,纯属猜测,有哪位大大知道正确缘由,请高知,谢谢!)
    但BigList相差List还是蛮大的,如果将count变的更小点,差距将更大.不知道"BigList在count>100的时候有更优秀的效率",在哪体现了.
    看看PowerCollections的doc:
    BigList<T> provides a list of items, in order, with indices of the items ranging from 0 to one less than the count of items in the collection. BigList<T> is optimized for efficient operations on large (>100 items) lists, especially for insertions, deletions, copies, and concatinations.  

    PS: 昨天说到PowerCollections有些出自Jeff之手,但今天看源代码作者好像都是Peter Golde, sorry for it.不过Peter Golde也应该是位大师级人物吧. 看来不可全信别人的代码啊,即使出自大师之手,还是应该用平静的心态去研究啊.

    完整的测试代码


    后一篇:第2枪小谈RemoveALL算法
  • 相关阅读:
    洛谷P3811题解
    洛谷P3353在你窗外闪耀的星星-题解
    Map根据value来排序
    java8 groupby count
    Java反射
    maven profile环境切换
    获取nginx代理情况下的真实ip
    获取request里header的name和value
    git 删除iml文件
    java list 排序
  • 原文地址:https://www.cnblogs.com/anders06/p/789508.html
Copyright © 2011-2022 走看看