Предположим, у нас есть некий массив, из которого нужно удалить часть элементов по условию
Массив = СгенерироватьМассив(мэлементов);
Функция СгенерироватьМассив(КоличествоЭлементов)
ГенераторСлучайныхЧисел = новый ГенераторСлучайныхЧисел;
Массив = Новый Массив;
Для Индекс = 1 По КоличествоЭлементов Цикл
Массив.Добавить(ГенераторСлучайныхЧисел.СлучайноеЧисло(0,200) - 100);
КонецЦикла;
Возврат Массив;
КонецФункции
Большая часть людей делает это так:
Для обратныйИндекс = - Массив.ВГраница() По 0 Цикл
Индекс = - обратныйИндекс;
Если Не Условие1(Массив[Индекс]) Тогда
Массив.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
Основной недостаток такого метода в том, что скорость его выполнения не линейна, поясню почему: на каждую операцию удаления запускается цикл, который можно описать вот так:
Для Индекс = УдаляемыйИндекс По Массив.ВГраница() - 1 Цикл
Массив[Индекс] = Массив[Индекс + 1];
КонецЦикла;
Из этого следует что мы выполняем цикл в цикле.
Верным же способом удаления данных из массива можно назвать вот такой метод:
МаксимальныйИндекс = -1;
Для Каждого ЭлМассва Из Массив Цикл
Если Условие1(ЭлМассва) Тогда
МаксимальныйИндекс = МаксимальныйИндекс + 1;
Массив[МаксимальныйИндекс] = ЭлМассва;
КонецЕсли;
КонецЦикла;
Пока Массив.ВГраница() > МаксимальныйИндекс Цикл
Массив.Удалить(Массив.ВГраница());
КонецЦикла;
В таком случае удаление происходит значительно быстрее, так как мы всегда удаляем последний элемент массива.
Важное замечание: данное рассуждение актуально только для несортированных массивов, или сортированных массивов, удаляемые значения которых будут находится в начале массива.
Во вложении обработка, показывающая график с разницей по времени выполнения обоих способов (по вертикали – время в МС, по горизонтали – количество элементов). Обработка работает на управляемых формах для любых версий платформы 8.3.
В случае с вторым алгоритмом – график прямолинейный, в случае с первым – квадратичный (не совсем, но если кому интересно, может вывести верную формулу, одной из переменных которой нужно указать процент удаляемых данных)