【发布时间】:2023-04-06 12:08:01
【问题描述】:
我最近正在分析一个应用程序,试图找出某些操作为何极其缓慢。我的应用程序中的一个类是基于 LinkedList 的集合。这是一个基本大纲,仅显示了几种方法并删除了一些绒毛:
public class LinkInfoCollection : PropertyNotificationObject, IEnumerable<LinkInfo>
{
private LinkedList<LinkInfo> _items;
public LinkInfoCollection()
{
_items = new LinkedList<LinkInfo>();
}
public void Add(LinkInfo item)
{
_items.AddLast(item);
}
public LinkInfo this[Guid id]
{ get { return _items.SingleOrDefault(i => i.Id == id); } }
}
该集合用于将超链接(由 LinkInfo 类表示)存储在单个列表中。然而,每个超链接也有一个指向它的超链接列表,以及一个它指向的超链接列表。基本上,它是一个网站的导航地图。因为这意味着当链接相互返回时您可以进行无限递归,所以我将其实现为链表 - 据我了解,这意味着对于每个超链接,无论它被另一个超链接引用多少次,只有对象的一个副本。
上例中的 ID 属性是一个 GUID。
有了那个冗长的描述,我的问题很简单 - 根据分析器,在为一个相当小的网站构建此地图时,上面提到的索引器被调用不少于 27906 次。这是一个非凡的数额。我仍然需要确定是否真的有必要多次调用,但同时,我想知道是否有更有效的方法来执行索引器,因为这是分析器确定的主要瓶颈(也是假设它没有说谎!)。我仍然需要链表行为,因为我当然不希望这些超链接的一个副本在我的记忆中徘徊,但我还需要能够通过唯一键访问它们。
有没有人对提高这个索引器的性能有任何建议。我还有另一个使用 URI 而不是 GUID 的索引器,但由于构建传入/传出链接是由 GUID 完成的,因此问题较少。
谢谢; 理查德·莫斯
【问题讨论】:
-
为什么你需要一个链表行为?
-
好吧。通常我没有能够无限递归的集合。但是,如果链接 A 指向链接 B,链接 B 也指向链接 A,这意味着您可以愉快地从 a 跳到 b,再从 a 跳到 b,并且永远持续一天。所以我从对 LinkedList 的描述中认为它会更好地完成这项工作。也许我弄错了,一本字典就足够了……但除非我问有更多知识的人,否则我不会知道:)
-
Collections 不关心其内容中的引用。 LinkedList 是非常不适合这项工作的工具。
标签: c# dictionary linked-list