You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:04