PowerCollections研究: 第1弹竟就发现不少问题
昨天刚说了PowerCollections强大,今天就这么随手拿来一看发现不少问题,不光是设计,还有效率方面的.
(PS: PowerCollections是从<<CLR Via C#>>中看到的,Jeff说其的BigList在count>100的时候有更优秀的效率,而且里面提供了很多丰富的集合类.)
{
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 override void CopyTo(T[] array, int arrayIndex)
{
base.CopyTo(array, arrayIndex);
}
}
ListBase.CopyTo()啥事也没干,却又override一遍,这不摆明徒增开销嘛,继续汗!
再来看看CopyTo的代码,一看再吃一惊竟然是用foreach循环+set Arrary做的,这样的效率能忍受吗?
{
// 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 结果:
Release结果:
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算法