Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET:二维列表几乎比一维列表慢1000倍?_.net_Vb.net_Performance_List_Arraylist - Fatal编程技术网

VB.NET:二维列表几乎比一维列表慢1000倍?

VB.NET:二维列表几乎比一维列表慢1000倍?,.net,vb.net,performance,list,arraylist,.net,Vb.net,Performance,List,Arraylist,考虑以下代码: 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 - ti

考虑以下代码:

    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())
它包括两个列表。第一个是一维的,第二个是二维的

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


我是不是遗漏了什么?有没有办法加快速度,还是我做错了什么?我有一个程序需要几个二维数组,现在运行速度非常慢。如何加快速度,以便获得与列表为一维时相同的反馈?

问题在于一行代码

使arr2强类型化,它会快得多

Dim arr2 As New List(Of List(Of Double))
我运行了一个快速测试,在我的计算机上,它从大约7秒变为17毫秒

正如CodeInChaos正确指出的,缓慢的原因更多地与
.Add()
方法有关

编辑:
用编写VB.NET是今后避免此类问题的一种方法。通过这样做,您将看到一个编译时错误,上面写着“Option Strict On disallows late binding。”

您有一个列表列表,而不是一个二维数组……这不是一个二维列表。我看不出一个列表列表是如何完成任何有用的事情的。你能描述一下你的实际代码和要求吗?也许有人能帮你做一个更好、更有效的设计。哦,好吧,我很笨。知道为什么第二个这么慢吗?科迪:这是一个图形应用程序。我在跟踪一系列的多边形,每个多边形都有一系列的点。列表的第一个索引定义了我要处理的多边形,第二个索引定义了该多边形的顶点。因此,arr(1)(12)将是第二个多边形的第13个顶点,等等。那么,您实际上是将第一个列表声明为
list(of Object)
,还是使用类似
list(of MyPolygonClass)
?装箱/取消装箱意味着将值类型转换为
Object
<代码>列表不是值类型。这只是简单的类型转换(铸造),这确实很慢。我不认为拳击/铸造是这里的问题。我对VB.net不是很熟悉,但看起来第二个列表中的
添加
是动态调度的。@CodeInChaos-几分钟前我在查看代码时注意到了这一点。这也是为什么add都是小写的。如果它是强类型的,Visual Studio会自动修复该案例。@CodeInChaos-你完全正确。我将arr2实例化改回了对象列表的方式。然后我将循环中的行更改为这个
DirectCast(arr2(0),List(Double))。添加(3.14159)
,这也会在17毫秒内运行。@Steve:这是一个伟大的发现。我和劳伦特在想同样的事情;在原始代码中实际上没有拳击,但是我没有时间发布比你更完整的答案。然而,奇怪的是,为什么VB.NET没有自动更正
add
add
。考虑到它不区分大小写,Intellisense通常会在您键入时自行修复此类内容。如果你在文本中复制粘贴的话就不会了,但是OP写代码的时候应该有。