一个Microsoft.VisualBasic.Collection和.NET System.Collections.Generic.Dictionary(Of TKey, TValue)之间已知的性能差异是什么?

3
我正在为费城一家交易公司开展一个相当大的项目。该公司利用自动化交易算法处理流式报价,并每秒钟数十次发送数百种产品的报价。显然,性能是一个重大问题。(这让我质疑为什么我们要使用VB.NET,但那是另一个完全不同的话题。)
我相对较新加入了公司,并与另外一个人一起处理已经存在一段时间的代码。此代码利用Microsoft.VisualBasic.Collection对象来存储所有产品(表示ETF或股票对及其相关数据的对象)并从中进行大量搜索/检索。
据我所知,Collection类已被弃用,几乎没有人再使用它了。在我们更近期的代码中,我们使用.NET集合,例如List(Of T)和Dictionary(Of TKey, TValue),我认为用Dictionary替换旧的Collection可能是有道理的。然而,由于源代码相当庞大,继续进行此替换将是一项重大任务;因此,我的问题只是这样的:
是否有人实际测量过旧的Collection和.NET Dictionary之间的性能差异?出于任何原因,这样的比较是否不适当?显然,我们目前使用Collection做的一切都可以用Dictionary来完成;基本上我只想知道,对我们来说是否有意义去查看代码并进行这个转换,或者这样做实际上是浪费时间。
编辑:最初在问题中,我将我们当前使用的Collection称为VB6 Collection。在阅读前两个回答后,我意识到它更准确地是Microsoft.VisualBasic.Collection,这似乎是一种用于VB6和VB.NET之间兼容性的类。我认为问题仍然存在。
根据Kenneth Cochran答案中提供的第一个链接,我得出结论,对于我们的目的来说,Dictionary确实比Collection更适合,因为它在按键检索项目和运行“ForEach”循环时的性能比Collection快几毫秒,对于10,000次运行而言。在我们公司,这是一个现实的情况;代码中有很多像以下语句的地方:
Dim ETF as ETFdetails = ETFcoll(sym)

正如我所说的,这些代码会在数百个产品上执行,每秒钟执行多次。考虑到这一点,我倾向于认为我们应该继续进行更改,然后测量任何性能差异。我预计我们至少会看到一个轻微但明显的改进。

我刚才说的有什么明显的问题吗?如果有,请指出!

4个回答

4
如果您正在使用VB.NET,那么您并没有使用VB6集合。VB.NET集合在功能上等同于VB6集合,但它们并不相同。 http://www.vbmigration.com/Blog/post/2008/11/Speed-up-your-VBNET-collections.aspx 比较了各种.NET集合类型与VB6集合,包括VB.NET集合。每种集合类型都有其优点和缺点(否则我们为什么要选择这么多集合类型)。一些集合在插入时更快,但搜索则会牺牲性能,反之亦然。一些集合在小集合中更快,而其他集合在大集合中更快。您的选择应取决于哪个性能属性对您最重要。

这里有一张表格,显示了标准.NET集合类型的相对性能。请注意,VB.NET集合未包含在内:http://www.artima.com/forums/flat.jsp?forum=152&thread=179998


+1. 我想强调的是,丹需要根据哪个性能属性对他来说更重要来做出决定。这可能意味着他需要进行自己的测量。这也意味着设定明确的目标,了解系统必须如何快速响应,并测量不同的组件以查看它们是否匹配。即使字典更快,如果集合足够快,则无需更改。 - MarkJ
从 Kenneth 提供的链接中,我认为将 Collection 转换为 Dictionary 是有意义的(请参见我的编辑)。你觉得这样合理吗? - Dan Tao
是的,虽然我倾向于在将其放入生产代码之前在生产机器上测试潜在的速度提升。我不知道这对您来说是否可行。 - MarkJ

1

VB.Net 的性能没有问题。它编译成与 C# 相同的 IL,然后再 JIT 编译成机器语言。这就是为什么它被称为 .Net 框架 而不是 .Net 虚拟机

虽然我没有看到 VB6 Collection 与 VB.Net Dictionary 的直接比较,但我认为它们应该是相似的,因为底层算法本质上都是哈希表。话虽如此,如果有一点小差异,我倾向于给 Dictionary 优势,因为它没有涉及到强制转换/晚期绑定。系统将花费更少的时间来检查或翻译类型。

当然,这假设您在使用 VB.Net 时以强类型方式,打开了 Option Strict 和 Option Explcit。


我知道.NET语言都编译成相同的IL代码;我并不是在质疑公司使用VB.NET而不是C#等其他语言。然而,考虑到老板极其强调性能(我会说他有点偏执),我个人还是不太明白为什么我们不用像C++这样的语言进行编码。当然,我对.NET还比较新手,也许我的想法C++更快的想法是错误的。我主要担心的是迟绑定。我们正在使用的集合中,键和值可以是任何类型的对象。我认为这会影响性能,即使只是稍微影响一点。 - Dan Tao

1
除了性能之外,我仍然建议使用字典。 它具有通用类型参数,因此您可以直接指定字典要保存的数据类型。这可以防止许多错误(可以在编译时检测到),并且应该提高性能,因为许多强制转换和运行时类型检查是不必要的。
这两种数据结构的算法复杂度均为O(1)。

0

这是一个旧问题,但我希望它能帮到您。

根据 http://msdn.microsoft.com/en-us/library/vstudio/ms172875(v=vs.100).aspx

元素类型。Visual Basic 集合支持 Object 类型的元素,这不是类型安全的,因为你可以添加任何数据类型的元素。这通常会导致性能下降,因为编译器必须将元素装箱和取消装箱以将其转换为和从对象数据类型中转换。 .NET Framework 的一些集合也有 Object 类型的元素,但许多其他集合是强类型的,意味着它们支持特定类型的元素,这使它们是类型安全的,并且通常具有最佳性能。

问题是您是否需要在该集合中存储不同类型的对象。

我进行了测试。我有几个嵌套的 Microsoft.VisualBasic.Collection,并且程序迭代约 6600 次才能找到这些集合中的一个项。 它花费大约 1920ms 才能完成。

然后我用一个单一的System.Collections.Generics.Dictionary(Of String, String)替换了它(因为它只存储字符串),并且在相同数量的数据下只需要大约5毫秒。差别很大!!!

在这种情况下,装箱和拆箱是一项昂贵的操作。

我希望这回答了你的问题。

来自阿根廷的问候!

附言:对不起我的英语很糟糕!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接