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



Я нашел пример, показывающий, что можно удалять и без зацикливания. Это выглядит проще, чем вставлять код.
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
Я должен был угадать insert, потому что он всегда может просто добавить, тогда как при удалении вам нужно беспокоиться о дырах.
А какая версия vb? Если вы находитесь в .Net и выполняете операции удаления или вставки, вам вообще не следует использовать для этого массив.
Традиционный VB. Я не могу просто добавить, его нужно вставить.
Оба имеют примерно одинаковую производительность, потому что оба требуют создания нового массива. Массивы представляют собой непрерывные структуры фиксированного размера.
Чтобы сохранить это на вставке, необходимо создать новый массив с дополнительным элементом. Все существующие значения копируются в массив в их новой позиции, а затем добавляется вставленный элемент.
Чтобы сохранить это при удалении, необходимо создать новый массив с одним элементом меньше. Затем все существующие записи, кроме удаления, должны быть скопированы в новый массив.
Обе эти операции имеют по существу одинаковые операции над почти одинаковыми размерами. Производительность существенно не изменится.
Для удаления каждый элемент после удаленного должен быть сдвинут вниз.
Для вставки необходимо найти место для нового элемента. Если после массива, который он может присоединить, есть пустое место, это не требует времени, и единственное время, которое тратится - больше каждого элемента после нового элемента, чтобы освободить место в середине.
Если локально нет доступного места, необходимо выделить весь новый массив и скопировать каждый элемент.
Таким образом, при рассмотрении вопроса о добавлении или удалении в одну и ту же позицию массива вставка может быть такой же быстрой, как и удаление, но может быть намного дольше. Вставка не будет быстрее.
По теме, но не совсем ответ:
Вставка и удаление - это не приложение, которое применимо к массивам. Это выходит за рамки «оптимизации» и приводит к плохому программированию.
Если это будет скрыто в нижней части структуры вызовов, и кто-то в конечном итоге будет вызывать его неоднократно, вы можете серьезно пострадать в производительности. В одном случае я изменил сортировку вставкой массива, чтобы просто использовать связанный список, и он изменил время выполнения с 10 + часов (заблокировал машину) на секунды / минуты).
Он заполнял список IP-адресами. В том виде, в каком он был разработан и протестирован в адресном пространстве класса c, он работал нормально, но у нас были требования работать с адресным пространством класса b без сбоев (это может занять некоторое время, но не часы). Перед нами стояла задача провести минимально возможный рефакторинг, чтобы он не провалился.
Не думайте, что вы знаете, как будет использоваться ваш взлом.
Что ж, я не предполагаю, что точно знаю, как и где оно будет использоваться - я знать, как оно будет использоваться. Это приложение ASP 10-летней давности, которое будет постепенно прекращено. Вы не поверите, но это " hack "заменит код, который во много раз длиннее и имеет гораздо худшую производительность.
@ilitirit, есть еще много людей, которые используют vb6. Вы должны указать, имеете ли вы в виду VB.Net, что, как я предполагаю, вы обсуждаете. Я ожидал, что между двумя платформами будет разница в производительности.