Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Listview VS архив в памяти, почему архив проигрывает по скорости? / 3 сообщений из 3, страница 1 из 1
10.12.2015, 21:40
    #39125373
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Listview VS архив в памяти, почему архив проигрывает по скорости?
Имеется около 100 000 значений, которые могут повторяться. Задача составить их список с подсчетом сколько раз каждое значение повторяется.
Делаю так, прежде чем добавить следующее значение в список перебираю уже ранее добавленные и если оно там встречается, то прибавляю единичку к счетчику для этого значения, если не встречается, то добавляю как новое.
Что обнаружилось, Listview с этим справляется в несколько раз быстрее, чем архив в памяти.
Прилагаю примерчик, значения генерируются рандомно, количество значений уменьшено до 20 000 и даже при таком количестве архив работает почти в два раза медленнее.
Может кто подскажет, как ускорить работу с данными в архиве?
...
Рейтинг: 0 / 0
11.12.2015, 03:04
    #39125447
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Listview VS архив в памяти, почему архив проигрывает по скорости?
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
11.12.2015, 14:02
    #39125845
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Listview VS архив в памяти, почему архив проигрывает по скорости?
Большое спасибо!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Listview VS архив в памяти, почему архив проигрывает по скорости? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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