LinkedList或List还是其他什么?

时间:2011-03-23 11:12:04

标签: .net

我已经创建了一个日志解析器,用于解析包含大量行的日志文件。当前实现使用LinkedList<T>来构建条目列表并且非常快。

我还构建了一个使用虚拟列表视图的日志查看器。正如您可能理解的那样,链接列表不能很好地工作。

我正在考虑在进行初始解析时使用LinkedList,然后在完成时分配List(指定容量)。然后我只需使用AddRange将日志条目添加到列表中。

由于我在日志文件中使用FileSystemWatcher,因此稍后会添加更多新项目,但与初始解析的速率不同。

切换是否是一个好主意,或者你有更好的建议吗?

更新

解析由实现以下接口的东西完成(每个日志格式一个解析器)。

Public Interface ILogParser
    Sub Parse(ByVal stream As IO.Stream)
    Sub Parse(ByVal stream As IO.Stream, ByVal offset As Long)
    Event EntryParsed(ByVal sender As Object, ByVal e As ParsedEntryEventArgs)
    Event Completed(ByVal sender As Object, ByVal e As EventArgs)
End Interface

logviewer订阅这两个事件,并将EntryParsed事件中的每个条目添加到LinkedList。解析整个日志(文件)流时会触发Completed事件。

完成后,我开始跟踪成功解析的流中的最后一个位置,并在每次触发Parse(fileStream, lastPosition)事件时调用日志解析器方法FileSystemWatcher

3 个答案:

答案 0 :(得分:1)

我写了很多解析器,我使用List&lt;&gt;而不是LinkedList,我通常做的是我在开始解析之前猜测List的大小(你经常可以从文件的大小或行数中猜出你的List需要多大)。

话虽如此,如果使用List让你的系统有很多OurOfMemory execptions,我会交换到LinkedList&lt;&gt;。

旁注,当我说很多行时我的意思是200k +

答案 1 :(得分:0)

LinkedList在此处不提供任何好处,因为您没有“删除”或“插入”日志条目的任何要求。如果日志是tiemstamp base,那么这些将被“追加”。

答案 2 :(得分:0)

我第一次解析日志文件时,已从List<T>切换到LinkedList<T>。第一次解析完成后,我将所有内容复制到List<T>,以便能够在我的虚拟列表视图中使用它。

解决方案效果很好,性能提升优先;)