Что быстрее в VB? Удалить элемент из массива или вставить один? - PullRequest
0 голосов
/ 13 октября 2008

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

Edit: Это VB6, а не VB.NET. Из соображений отображения я должен использовать вставку, а не добавление.

Ответы [ 5 ]

1 голос
/ 13 октября 2008

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

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

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

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

1 голос
/ 13 октября 2008

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

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

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

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

0 голосов
/ 13 октября 2008

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

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

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

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

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

0 голосов
/ 13 октября 2008

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

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

0 голосов
/ 13 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...