我正在为费城的一家贸易公司做一个相当大的项目。该公司利用自动交易算法处理流媒体报价,并每秒发送数百种产品的报价数十次。显然,性能是一个重要的问题。 (这让我怀疑为什么我们使用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)
正如我所说,这些线路在数百种产品上执行,每秒多次。考虑到这一点,我倾向于认为我们应该继续进行改变,然后衡量任何性能差异。我希望我们至少会看到一个温和而明显的改善。
我刚刚说过的话有什么明显的错吗?如果是这样,请指出!
答案 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。抱歉,我的英语太糟糕了!