powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Listview VS архив в памяти, почему архив проигрывает по скорости?
3 сообщений из 3, страница 1 из 1
Listview VS архив в памяти, почему архив проигрывает по скорости?
    #39125373
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется около 100 000 значений, которые могут повторяться. Задача составить их список с подсчетом сколько раз каждое значение повторяется.
Делаю так, прежде чем добавить следующее значение в список перебираю уже ранее добавленные и если оно там встречается, то прибавляю единичку к счетчику для этого значения, если не встречается, то добавляю как новое.
Что обнаружилось, Listview с этим справляется в несколько раз быстрее, чем архив в памяти.
Прилагаю примерчик, значения генерируются рандомно, количество значений уменьшено до 20 000 и даже при таком количестве архив работает почти в два раза медленнее.
Может кто подскажет, как ускорить работу с данными в архиве?
...
Рейтинг: 0 / 0
Listview VS архив в памяти, почему архив проигрывает по скорости?
    #39125447
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PantaloneЧто обнаружилось, Listview с этим справляется в несколько раз быстрее, чем архив в памяти.
Прилагаю примерчик, значения генерируются рандомно, количество значений уменьшено до 20 000 и даже при таком количестве архив работает почти в два раза медленнее.На самом деле не в два, а в несколько десятков раз.
В вашем коде основное время тратится на обновление прогрессбара и статусбара. Если делать это не в каждом проходе цикла, а в каждом 100-м...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
For i = 1 To fdNumOfValues

    n = Int(fdNumOfValues * Rnd)
    Call LWUpdate(n)
    If i Mod 100 = 0 Then '<<< добавлено
      ProgressBar = i
      StatusBar1.Panels(1).Text = (GetTickCount() - StartTime) / 1000
      DoEvents
    End If '<<< добавлено

Next

..., то разница составляет 1,5 сек против 48 сек
В процедуре ArchUpdate переменная pID имеет тип Long, и каждый раз при сравнении If MyArch(i).ID = pID происходит преобразование в строку. Почему бы не сделать преобразование один раз при вызове процедуры?
Код: vbnet
1.
2.
3.
4.
5.
Sub ArchUpdate(pID As String)
'...
    Call ArchUpdate(CStr(n))
'или
    Call ArchUpdate((n))

Время уменьшается в 3 раза, до 16 сек.

А вообще, надо делать на коллекции или на словаре. Неоптимальный способ массив+коллекция уже быстрее листвью - сама генерация массива занимает 0,4 сек, с загрузкой в листвью - 1 сек.
...
Рейтинг: 0 / 0
Listview VS архив в памяти, почему архив проигрывает по скорости?
    #39125845
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Listview VS архив в памяти, почему архив проигрывает по скорости?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]