AZJIO2
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору nik4z Цитата: Совет от AZJIO2 особо не поможет, любая модификация массива все равно потребует большого времени | Это легко проверяется. Берём массив с тысячью элементов и с миллионом элементов и начинаем вставлять некий текст в первый от начала, во второй в конце, оставив тысячу элементов для заполнения в цикле 1000 раз, время добавления будет одинаковым. Теперь второй тест берём массив пустой и с миллионом элементов и просто делаем ресайз (ReDim) 1000 раз. Так вот тот, что начинал с 0 и тот, что начинался с миллиона большая разница... проверено. Граница заметности начинается с 1000 и растёт прямо пропорционально размеру массива. SLIDER999 Я имел ввиду, что когда ты добавляешь элемент функция делает его ресайз (ReDim), блин въелось это английское слово "переизменение", точнее увеличение на 1 элемент, чтобы вставить его туда, смотри функцию _ArrayAdd изнутри. каждый вызов делает ReDim, если работаешь в цикле, то вызываешь ReDim много раз. Если вызов однократный то не заметишь, а если вставляешь тучу элементов то это очень заметно. Вывод: подстроиться под задачу. Если число элементов имеет ограничение то сделай массив сразу по максимуму. Если максимум превышает среднестатистическую заполненность, то сделай размер по средне-статистической заполненностью и перед каждым добавлением партии элементов сравни разницу между размером массива и существующими данными и больше ли она по сравнению с количеством добавляемых элементов, если да, то увеличь массив сразу на 1000 или на 10 000. В общем то даже если ты создашь массив сразу огромным, он по-больше потребляет память (процесс = 4 мб - пустой массив, 19 мб - 4 миллиона элементов в незаполненном массиве) потребляет только на адреса ячейки ну сравни по увеличению процесса в памяти, но по другим чувствительным параметрам ты этого не заметишь, создал и создал, и забыл, что он большой. Или к примеру начались сутки, увеличил массив так чтобы в него вошли данные за сутки, в конце дня увеличил ещё на сутки. Или увеличил на час и проверяй каждые 50 мин. Или если ты вставляешь партию известного размера, то сначала увеличь массив на размер добавляемых, потом добавляй (не с помощью _ArrayAdd). В любом случае "время" это обратная сторона универсальных функций, таких как _ArrayAdd. | Всего записей: 85 | Зарегистр. 27-01-2016 | Отправлено: 07:45 03-05-2016 | Исправлено: AZJIO2, 08:19 03-05-2016 |
|