什么在VB中更快?从数组中删除元素或插入一个元素?

时间:2008-10-13 16:12:40

标签: arrays optimization vb6

哪个更快? someCondition具有相同的概率,因为它是假的。

插入:

arrayList = Array("apple", "pear","grape")
if someCondition then
    ' insert "banana" element
end if

删除:

arrayList = Array("apple","banana","pear","grape")
if not someCondition then
    ' remove "banana" element
end if

看起来它完全取决于Insert和Remove的实现。那么一般来说哪个更快?我倾向于插入,因为我已经读过可以使用CopyMemory插入而不循环。删除是否相同?有人有例子吗?

编辑: 这是VB6,而不是VB.NET。 出于显示原因,我必须使用insert而不是append。

5 个答案:

答案 0 :(得分:1)

两者都具有相同的性能,因为两者都需要创建新的数组。阵列是固定尺寸的连续结构。

为了在插入上维护它,必须使用附加元素创建新的Array。所有现有值都将在其新位置复制到数组中,然后添加插入的元素。

为了保持删除,必须使用少一个元素创建一个新数组。然后,除删除之外的所有现有条目都必须复制到新数组中。

这两种操作在几乎相同的尺寸上具有基本相同的操作。表现不会有太大差异。

答案 1 :(得分:1)

对于删除,必须将删除项目后的每个项目向下移动。

对于插入,必须为新项找到空格。如果它可以附加的数组之后有空的空格,那么这就没有时间,并且新项目之后每个项目的唯一时间花费更多,以便在中间腾出空间。

如果本地没有可用空间,则必须分配一个全新的数组并复制每个项目。

因此,在考虑添加或删除相同的数组位置时,插入可能与删除一样快,但可能更长。插入不会更快。

答案 2 :(得分:0)

我找到了一个示例,表明可以在不循环的情况下删除。它看起来比插入的代码简单。

Public Sub RemoveArrayElement_Str(AryVar() As String, ByVal _
    RemoveWhich As Long)
    '// The size of the array elements
    '// In the case of string arrays, they are
    '// simply 32 bit pointers to BSTR's.
    Dim byteLen As Byte

    '// String pointers are 4 bytes
    byteLen = 4

    '// The copymemory operation is not necessary unless
    '// we are working with an array element that is not
    '// at the end of the array
    If RemoveWhich < UBound(AryVar) Then
        '// Copy the block of string pointers starting at
        ' the position after the
        '// removed item back one spot.
        CopyMemory ByVal VarPtr(AryVar(RemoveWhich)), ByVal _
            VarPtr(AryVar(RemoveWhich + 1)), (byteLen) * _
            (UBound(AryVar) - RemoveWhich)
    End If

    '// If we are removing the last array element
    '// just deinitialize the array
    '// otherwise chop the array down by one.
    If UBound(AryVar) = LBound(AryVar) Then
        Erase AryVar
    Else
        ReDim Preserve AryVar(UBound(AryVar) - 1)
    End If
End Sub

http://www.vb-helper.com/howto_delete_from_array.html

答案 3 :(得分:0)

我必须猜测插入,因为它总是可以附加,而删除时你必须担心漏洞。

但什么版本的vb?如果您在.Net中并进行删除或插入,则根本不应使用数组。

答案 4 :(得分:0)

关于主题但不是一个答案:

插入和删除不是适用于阵列的应用程序。它超越了“优化”并进入了错误的编程。

如果这隐藏在呼叫结构的底部并且有人最终反复调用它,则可能会受到严重的性能影响。在一个案例中,我更改了一个数组插入排序,只需使用一个链表,它将运行时间从10 +小时(锁定机器)改为秒/分钟。

用ip地址填充列表框。在class-c地址空间设计和测试时,它运行良好,但是我们有要求在没有失败的情况下处理b类地址空间(可能需要一段时间,但不是几小时)。我们的任务是尽可能减少重构,以使其不失败。

不要假设你知道如何使用你的黑客。