Что быстрее в VB? Удаление элемента из массива или вставка?

Что быстрее? 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. По причинам отображения я должен использовать вставку, а не добавление.

@ilitirit, есть еще много людей, которые используют vb6. Вы должны указать, имеете ли вы в виду VB.Net, что, как я предполагаю, вы обсуждаете. Я ожидал, что между двумя платформами будет разница в производительности.

Onorio Catenacci 13.10.2008 20:17

Я изменил теги к вопросу, чтобы его подобрали для поиска по vb6.

Onorio Catenacci 13.10.2008 22:06
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
2
5 322
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я нашел пример, показывающий, что можно удалять и без зацикливания. Это выглядит проще, чем вставлять код.

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

Я должен был угадать insert, потому что он всегда может просто добавить, тогда как при удалении вам нужно беспокоиться о дырах.

А какая версия vb? Если вы находитесь в .Net и выполняете операции удаления или вставки, вам вообще не следует использовать для этого массив.

Традиционный VB. Я не могу просто добавить, его нужно вставить.

ilitirit 13.10.2008 20:19

Оба имеют примерно одинаковую производительность, потому что оба требуют создания нового массива. Массивы представляют собой непрерывные структуры фиксированного размера.

Чтобы сохранить это на вставке, необходимо создать новый массив с дополнительным элементом. Все существующие значения копируются в массив в их новой позиции, а затем добавляется вставленный элемент.

Чтобы сохранить это при удалении, необходимо создать новый массив с одним элементом меньше. Затем все существующие записи, кроме удаления, должны быть скопированы в новый массив.

Обе эти операции имеют по существу одинаковые операции над почти одинаковыми размерами. Производительность существенно не изменится.

Ответ принят как подходящий

Для удаления каждый элемент после удаленного должен быть сдвинут вниз.

Для вставки необходимо найти место для нового элемента. Если после массива, который он может присоединить, есть пустое место, это не требует времени, и единственное время, которое тратится - больше каждого элемента после нового элемента, чтобы освободить место в середине.

Если локально нет доступного места, необходимо выделить весь новый массив и скопировать каждый элемент.

Таким образом, при рассмотрении вопроса о добавлении или удалении в одну и ту же позицию массива вставка может быть такой же быстрой, как и удаление, но может быть намного дольше. Вставка не будет быстрее.

По теме, но не совсем ответ:

Вставка и удаление - это не приложение, которое применимо к массивам. Это выходит за рамки «оптимизации» и приводит к плохому программированию.

Если это будет скрыто в нижней части структуры вызовов, и кто-то в конечном итоге будет вызывать его неоднократно, вы можете серьезно пострадать в производительности. В одном случае я изменил сортировку вставкой массива, чтобы просто использовать связанный список, и он изменил время выполнения с 10 + часов (заблокировал машину) на секунды / минуты).

Он заполнял список IP-адресами. В том виде, в каком он был разработан и протестирован в адресном пространстве класса c, он работал нормально, но у нас были требования работать с адресным пространством класса b без сбоев (это может занять некоторое время, но не часы). Перед нами стояла задача провести минимально возможный рефакторинг, чтобы он не провалился.

Не думайте, что вы знаете, как будет использоваться ваш взлом.

Что ж, я не предполагаю, что точно знаю, как и где оно будет использоваться - я знать, как оно будет использоваться. Это приложение ASP 10-летней давности, которое будет постепенно прекращено. Вы не поверите, но это " hack "заменит код, который во много раз длиннее и имеет гораздо худшую производительность.

ilitirit 13.10.2008 22:08

Другие вопросы по теме