自制链接列表非常慢

时间:2014-10-15 14:16:09

标签: c# .net c#-4.0

出于教育目的,我必须在C#中开发一个非常基本的自制链表。它应该只能添加元素和其他一些花絮。我的主要问题是,与框架集合相比,添加和枚举操作真的很慢,我做错了什么,或者你不能用托管代码做得更好?

(枚举超过1000000个元素大约需要500毫秒,附加1000000个元素需要大约700毫秒)

internal class GenericBuffer<T> : IEnumerable<T>
{
    protected class BufferNode
    {
        internal T Buffered { get; set; }
        internal BufferNode Next { get; set; }

        internal BufferNode(T buffered)
        {
            this.Buffered = buffered;
            this.Next = null;
        }
    }

    protected BufferNode First { get; set; }
    protected BufferNode Last { get; set; }
    public int Count { get; protected set; }

    internal GenericBuffer()
    {
        this.First = null;
        this.Last = null;
        this.Count = 0;
    }

    internal void Append(T toBuffer)
    {
        if (this.First == null)
        {
            this.First = this.Last = new BufferNode(toBuffer);
        }
        else
        {
            this.Last.Next = new BufferNode(toBuffer);
            this.Last = this.Last.Next;
        }

        this.Count++;
    }

    internal bool PullHead(out T head)
    {
        if (this.First == null)
        {
            head = default(T);
            return false;
        }
        else if (this.First == this.Last)
        {
            head = this.Last.Buffered;
            this.First = null;
            this.Last = null;
            this.Count--;
            return true;
        }
        else
        {
            head = this.First.Buffered;
            this.First = this.First.Next;
            this.Count--;
            return true;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        var currentNode = this.First;

        while (currentNode != null)
        {
            yield return currentNode.Buffered;
            currentNode = currentNode.Next;
        }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

感谢您就该主题提出的任何建议和提示。 :)

1 个答案:

答案 0 :(得分:2)

List<T>的实现可以通过Reference Source与大多数.NET框架一起在线获取,因此我强烈建议您检查一下并将其与您的实现进行比较。

通常,托管语言旨在使更高级别的功能更易于实现和维护,权衡是优化更难实现,而其他明智的简单,低级指针交互(如链表)可能会变得更加沉重在托管代码中。

此外,请务必引用与您测试过的其他实施相比较的一些比较时间。