【问题标题】:VB.NET: 2-dimensional list is almost 1000x slower than 1-dimensional list?VB.NET:二维列表几乎比一维列表慢 1000 倍?
【发布时间】:2011-06-25 23:37:43
【问题描述】:

考虑以下代码:

    Dim arr1 As New List(Of Double)
    Dim arr2 As New List(Of Object)

    Dim timeStart As DateTime = Now

    For x As Integer = 0 To 1000000
        arr1.Add(3.14159)
    Next

    Dim timeEnd As DateTime = Now

    MsgBox(((timeEnd - timeStart).Seconds).ToString())

    timeStart = Now

    arr2.Add(New List(Of Double))

    For x As Integer = 0 To 1000000
        arr2(0).add(3.14159)
    Next

    timeEnd = Now

    MsgBox(((timeEnd - timeStart).Seconds).ToString())

它涉及 2 个列表。第一个是一维的,第二个是二维的。

第一个例程(在第一个列表上运行)在大约 0.015 秒内完成。然而,第二个例程(在第二个列表上运行)需要将近 10 秒。唯一的区别是第二个列表是二维的。

我在这里遗漏了什么吗?有没有办法加快速度或者我做错了什么?我有一个程序需要几个二维数组,现在运行速度非常慢。如果列表是一维的,我怎样才能加快速度以获得相同的反馈?

【问题讨论】:

  • 你有一个列表列表,而不是一个二维数组......
  • 这不是二维列表。我看不到列表列表如何完成任何有用的事情。您能描述一下您的实际代码和要求吗?也许有人可以帮助您设计出更好、更高效的设计。
  • 哦,好吧,我很笨。知道为什么第二个这么慢吗?
  • Cody:它用于图形应用程序。我正在跟踪一系列多边形,每个多边形都有一系列点。列表的第一个索引定义了我正在处理的多边形,第二个定义了该多边形的哪个顶点。所以 arr(1)(12) 将是第二个多边形的第 13 个顶点,等等。
  • 那么,您实际上是将第一个列表声明为List(Of Object),还是使用List(Of MyPolygonClass) 之类的东西?

标签: .net vb.net performance list arraylist


【解决方案1】:

问题在于一行代码。

使 arr2 成为强类型,它会快得多...

Dim arr2 As New List(Of List(Of Double))

我进行了一次快速测试,通过这一更改,它从我的计算机上的大约 7 秒缩短到了 17 毫秒。

正如 CodeInChaos 正确指出的那样,速度缓慢的原因更多地与 .Add() 方法是 dynamically dispatched 有关。

编辑: 用Option Strict On 编写VB.NET 是将来避免此类问题的一种方法。通过这样做,您会看到一个编译时错误,显示“Option Strict On 不允许后期绑定”。

【讨论】:

  • 装箱/拆箱意味着将值类型object相互转换。 List<double> 不是值类型。这只是类型转换(强制转换),确实很慢。
  • 我不认为拳击/铸造是这里的问题。我不太了解VB.net,但看起来第二个列表的add 是动态调度的。
  • @CodeInChaos - 我在几分钟前查看代码时注意到了这一点。这也是为什么 .add 都是小写的原因。如果它是强类型的,Visual Studio 会自动修复这种情况。
  • @CodeInChaos - 你完全正确。我将 arr2 实例化改回它作为对象列表的方式。然后我将循环内的行更改为DirectCast(arr2(0), List(Of Double)).Add(3.14159),它也在 17 毫秒内运行。
  • @Steve:这是一个很棒的发现。我想知道和洛朗一样的事情;原始代码中实际上没有拳击,但我没有时间发布比你更完整的答案。然而,奇怪的是为什么 VB.NET 没有将add 自动更正为Add。考虑到它不区分大小写,Intellisense 通常会在您键入时自行修复此类内容。如果您复制并粘贴文本,则不是,但是当 OP 编写他的代码时应该有。
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2021-08-06
  • 2023-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多