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

时间:2009-05-13 02:16:48

标签: .net performance vb6 collections dictionary

我正在为费城的一家贸易公司做一个相当大的项目。该公司利用自动交易算法处理流媒体报价,并每秒发送数百种产品的报价数十次。显然,性能是一个重要的问题。 (这让我怀疑为什么我们使用VB.NET,但这完全是另一个话题。)

我对这家公司比较陌生,并且正在和另一个人讨论一些已经存在一段时间的代码。此代码使用Microsoft.VisualBasic.Collection对象来存储所有产品(表示ETF或股票对的对象以及关于每个产品的大量数据),并从该集合中进行大量搜索/检索。

据我所知,Collection类已被弃用,几乎没有人再使用它了。在我们最近的代码中,我们一直在使用.NET集合,例如List(Of T)和Dictionary(Of TKey,TValue),根据我的理解,用字典替换旧的Collection可能是有意义的。但是,由于源代码非常丰富,继续进行此替换将是一项重大任务;所以我的问题就是:

有没有人真正测量过旧Collection和.NET Dictionary之间的性能差异?这种比较,无论出于何种原因,不合适?当然,我们目前正在使用Collection进行的所有操作都可以使用Dictionary;基本上我只是想知道我们是否有必要通过代码并进行转换,或者如果这样做本质上是浪费。

编辑:最初在问题中我提到了我们用作VB6 Collection的当前Collection。在阅读了前两个答案之后,我意识到它更准确地是一个Microsoft.VisualBasic.Collection,它似乎是为了兼容VB6和VB.NET而引入的类。我认为问题仍然存在。

根据Kenneth Cochran的答案中提供的第一个链接,我被认为字典确实更适合我们的目的而不是集合,因为它在按键检索项目和运行“For Each”循环方面表现更好10,000次运行几毫秒。在我们公司,这是一个现实的场景;代码中有很多地方包含如下语句:

Dim ETF as ETFdetails = ETFcoll(sym)

正如我所说,这些线路在数百种产品上执行,每秒多次。考虑到这一点,我倾向于认为我们应该继续进行改变,然后衡量任何性能差异。我希望我们至少会看到一个温和而明显的改善。

我刚刚说过的话有什么明显的错吗?如果是这样,请指出!

4 个答案:

答案 0 :(得分: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 :(得分:1)

VB.Net性能没有任何问题。它编译成与C#相同的IL,然后将JIT编译为机器语言。这就是为什么它被称为.Net Framework 而不是.Net VM

虽然我没有看到VB6 Collection与VB.Net Dictionary的头对头比较,但我认为它们是相似的,因为底层算法本质上是一个哈希表。也就是说,如果存在一个小的差异,我倾向于给词典带来优势,因为没有涉及的转换/后期绑定。系统将花费更少的时间来担心检查或翻译类型。

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

答案 2 :(得分:1)

除了表现之外,我还是建议使用字典。 它具有泛型类型参数,因此您可以直接指定字典保存的数据类型。这可以防止许多错误(可以在编译时检测到)并且应该提高性能,因为许多强制转换和运行时类型检查是不必要的。

两种数据结构的算法复杂度为O(1)。

答案 3 :(得分:0)

这是一个老问题,但我希望无论如何都有帮助。

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

  

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

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

我做了测试。我有几个嵌套的Microsoft.VisualBasic.Collection,程序迭代大约6600次,以找到这些集合中的项目。完成需要大约1920ms。

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

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

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

来自阿根廷的干杯!

PS。抱歉,我的英语太糟糕了!