我正在为费城的一家贸易公司做一个相当大的项目。该公司利用自动交易算法处理流式报价并每秒数十次发送数百种产品的报价。显然,性能是一个重要的问题。 (这让我怀疑为什么我们使用 VB.NET,但这完全是另一个话题。)
我对公司相对较新,正在与另一个人一起研究一些已经存在了一段时间的代码。此代码利用 Microsoft.VisualBasic.Collection 对象来存储所有产品(代表成对的 ETF 或股票的对象以及关于每个产品的大量数据),并从该集合中进行大量搜索/检索。
据我了解,Collection 类已被弃用,几乎没有人再使用它了。在我们最近的代码中,我们一直在使用 .NET 集合,例如 List(Of T) 和 Dictionary(Of TKey, TValue),据我所知,用字典替换旧的集合可能是有意义的。但是,由于源代码相当庞大,因此进行此替换将是一项重大任务;所以我的问题是这样的:
有没有人实际测量过旧 Collection 和 .NET Dictionary 之间的性能差异?无论出于何种原因,这样的比较是否不合适?看起来我们目前用 Collection 做的所有事情我们都可以用 Dictionary 做;基本上,我只是想知道我们通过代码并进行这种转换是否有意义,或者这样做是否本质上是一种浪费。
编辑 :最初在问题中我提到了我们用作 VB6 集合的当前集合。阅读前两个答案后,我意识到它更准确地说是 Microsoft.VisualBasic.Collection,它似乎是为 VB6 和 VB.NET 之间的兼容性而引入的类。我认为这个问题仍然成立。
基于 Kenneth Cochran 的回答中提供的第一个链接,我相信字典确实比集合更适合我们的目的,因为它在通过键检索项目和运行“For Each”循环几毫秒方面表现更好10,000 次运行。在我们公司,这是一个现实的场景;代码中有很多地方带有如下语句:
Dim ETF as ETFdetails = ETFcoll(sym)
正如我所说,这些生产线每秒在数百种产品上执行多次。考虑到这一点,我倾向于认为我们真的应该继续进行更改,然后衡量任何性能差异。我预计我们至少会看到轻微但明显的改善。
我刚才说的有什么明显的错误吗?如果有,请指出!
最佳答案
如果您使用的是 VB.NET,则您没有使用 VB6 集合。 VB.NET 集合在功能上等同于 VB6 集合,但它们并不相同。 Francesco Balena’s Blog - Speed up your VB.NET collections比较了各种 .NET 集合类型与 VB6 集合,包括 VB.NET 集合。每种集合类型都有其优点和缺点(否则我们为什么会有这么多集合类型可供选择)。有些更快,插入以搜索为代价,反之亦然。有些在小集合时更快,而另一些在大集合时更快。您的选择应取决于对您而言最重要的性能属性。
这是我偶然发现的一张表,它给出了标准 .NET 集合类型的相对性能。注意不包括 VB.NET 集合:
.NET Buzz Forum - C# collection classes performance
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文地址:https://stackoverflow.com/questions/855761/
-
c++ - std::bitset 的性能如何? - 程序控制台
-
.net - Microsoft.VisualBasic.Collection 和 .NET System.Collections.Generic.Dictionary(Of TKey, TValue) 之间的已知性能差异是什么? - 程序控制台
-
r - 具有共享数据的多个ggplot2图 - 程序控制台
-
c++ - `std::variant` vs. 继承 vs. 其他方式(性能) - 程序控制台
-
asp.net - 如何加快 ASP.NET 应用程序的重启? - 程序控制台
-
oracle - 表连接效率问题 - 程序控制台
-
asp.net-mvc - 通过RPXNow加快20秒的OpenID登录 - 程序控制台
-
sql-server - 为什么在SQL Server中对索引列执行top(1)速度慢? - 程序控制台
-
sql-server - 什么是 Sql Server 中的书签查找? - 程序控制台
-
sql-server - SQL Server中的插入成本与更新成本 - 程序控制台
-
c++ - 将两位数字转换为低内存表示的最快方法 - 程序控制台
-
perl - 对数字和字符串之间的自动转换效率没有影响吗? - 程序控制台
-
推荐10个免费在线测试网页性能工具 - 程序控制台
-
java - 仅在用户不滚动RecyclerView时绑定(bind)ViewHolders - 程序控制台
-
.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗? - 程序控制台
-
c++ - 为什么反复调用clock_gettime时会看到400倍的异常时间? - 程序控制台
-
java - 绘制折线时,Google Maps Android的性能不佳,屏幕 map 滞后 - 程序控制台
-
c - 循环广播SIMD寄存器的每个元素 - 程序控制台
-
c# - Entity Framework Core 3.0 对包含集合导航属性的性能影响(笛卡尔爆炸) - 程序控制台
-
scala - 对两个列表进行元素求和的最快方法 - 程序控制台