如何提升VB.NET中循环执行速度?现有代码需从8秒优化至1秒
提速方案
核心问题分析
当前代码的性能瓶颈在于每次调用Find都是线性遍历LC.stresses列表:10000个元素每个要执行3次线性搜索,总遍历次数高达9亿次,这是耗时近8秒的根本原因。
具体优化步骤
1. 构建哈希索引字典
先把LC.stresses转换成以(Tag0D, Tag2D)为复合键的字典,将查找操作的时间复杂度从O(n)降到O(1):
' 替换StressType为你的stress对象实际类型 Dim stressDict As New Dictionary(Of Tuple(Of Integer, Integer), StressType) For Each stress In LC.stresses Dim key = Tuple.Create(stress.Tag0D, stress.Tag2D) ' 确保键唯一,若存在重复可根据业务逻辑处理(比如保留最后一个) If Not stressDict.ContainsKey(key) Then stressDict.Add(key, stress) End If Next
2. 替换线性搜索为字典查找
在并行循环中直接通过字典快速取值,避免重复遍历大列表:
Parallel.ForEach(gOutputElements_2D, Sub(number) Dim key1 = Tuple.Create(number.FirstNode.Tag, number.Tag) stressDict.TryGetValue(key1, number.Stress1) Dim key2 = Tuple.Create(number.SecondNode.Tag, number.Tag) stressDict.TryGetValue(key2, number.Stress2) Dim key3 = Tuple.Create(number.ThirdNode.Tag, number.Tag) stressDict.TryGetValue(key3, number.Stress3) End Sub)
3. 额外性能提升点
- 若使用VB 15及以上版本,建议用
ValueTuple替代Tuple,性能更优:' 字典定义改为 Dim stressDict As New Dictionary(Of (Integer, Integer), StressType) ' 创建键时直接用:(stress.Tag0D, stress.Tag2D) - 无需手动调整
Parallel.ForEach的并行度,默认会根据CPU核心数自动适配,避免过度线程开销。
效果预估
构建字典仅需遍历3万条数据,之后的3万次查找都是常数时间操作,总计算量从9亿次骤降至约6万次,执行时间可轻松控制在1秒以内。
内容的提问来源于stack exchange,提问作者Anas Ahmed
相关产品推荐
相关产品推荐

