14.07.2004, 16:02 | #1 |
Участник
|
Можно ли убыстрить загрузку в ListView ?
Можно ли убыстрить загрузку в ListView ? 60 000 записей загружается 1 минуту. Это очень медленно.
X++: void method1() { FormListItem mainItem ; int i ; LvElements.addColumn(0, new FormListColumn("First column", 0, 150)); warning(Time2Str(timeNow(),1,1)); For (i = 1; i <= 60000; i++ ) { mainItem = new FormListItem("ing"); LvElements.addItem(mainItem); } warning(Time2Str(timeNow(),1,1)); } |
|
14.07.2004, 16:17 | #2 |
Moderator
|
Пара общих советов, без привязки к Аксапте - из опыта WinApi.
1. Поищите пару методов, один из которых блокирует контрол от обнавления; другой разблокирует. Это позволяет избежать перерисовки контрола при добавлении новых элементов в цикле. Может быть это lock() и unlock() - честно говоря, пока нет времени проверить. 2. Попробуйте поиграться методом sort(). Дело может быть в том, что при добавлении каждого элемента listView может пересортировывать все значения, которые он отображает. Еще раз - это только общие соображения и путь к поиску ответа. Может быть кто-то поможет более конкретным советом. |
|
14.07.2004, 16:48 | #3 |
Участник
|
Re: Можно ли убыстрить загрузку в ListView ?
Цитата:
Изначально опубликовано AKit_3
Можно ли убыстрить загрузку в ListView ? 60 000 записей загружается 1 минуту. Это очень медленно. Мало того, эти 60000 записей загружаются на клиента. Вместо того, чтобы обрабатываться на сервере. Скажите - ЗАЧЕМ вы тянете эти записи на клиента? Показать пользователю? 60 тыс. записей? Что вы хотите добиться в конечном итоге? |
|
14.07.2004, 17:01 | #4 |
Moderator
|
Честно говоря, из кода не очевидно, что данные грузятся именно из БД.
Но в любом случае стоит подумать о том, что все данные пользователь просмотреть не сможет, а следовательно стоит ли грузить все ? Можно подумать про virtual listview - в котором данные будут подгружаться по мере их отображения - но это уже много программирования. Если сама задача невелика, то не стоит и связываться. |
|
14.07.2004, 17:27 | #5 |
Участник
|
скорее это был тест сравнения с 1С.
Похоже, была попытка сравнить работу таблицы значений с... выбрали listView как наиболее подходящий по терминологии. Другое дело, что listView используется в Аксапте так редко... А таблица значений в 1С - так часто... Уважаемые, думайте пожалуйста о быстродействии. думайте в терминологии трехуровневости. пытайтесь уменьшить количество передаваемых на клиента данных. пытайтесь максимально загрузить СУБД и сервер приложений. читайте Best Practice, наконец http://technet.navision.com/usered/B..._Practices.htm |
|
14.07.2004, 17:29 | #6 |
Участник
|
Не понял а куды мне их тягать - то ? Их юзер что тока через Grid увидать может ?
|
|
14.07.2004, 17:31 | #7 |
Участник
|
А читаю я с трудом. После второй страницы засыпаю.
|
|
14.07.2004, 17:57 | #8 |
Участник
|
тогда зачем вам ускорять загрузку listView?
|
|
15.07.2004, 10:08 | #9 |
Moderator
|
Я дома проверил свои предположения. Вот результаты:
Прежде всего, считаем, что данные отображаются не из датасета, а скажем вычисляются на лету, так как в противном случае выбор ListView на таком большом наборе данных мне кажется сомнительным решением. Итак, за основу берем первоначальный вариант: PHP код:
Теперь блокируем listView от перерисовки на время вставки: PHP код:
Прирост производительности, есть но не такой большой, как я ожидал. Что еще можно порекомендовать: 1. Свойство viewType - поставьте report, если еще не стоит. Если вариант с list работает еще более менее, то icon и small icon работают на порядок медленнее. 2. Сортировка - свойство Sort. Хм... довольно неожиданный результат. noSort - 10100 ascending - 7500 descending - 8100. 3. Можно поиграться из кода методом sort(). Он принимает целое число, и явно влияет на производительность. Но варианты передаваемого параметра нигде не задокументированны, а методом подбора мне удалось добиться только снижения производительности Итого 7500, против первоначальных 11300 -> 33% выигрыш. А вообще, если данных действительно так много - я бы посоветовал пересмотреть подход к отображению данных. Например отображать их не все сразу, а какими-то логическими порциями. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
15.07.2004, 14:03 | #10 |
Administrator
|
Цитата:
Изначально опубликовано Андре
А вообще, если данных действительно так много - я бы посоветовал пересмотреть подход к отображению данных. Например отображать их не все сразу, а какими-то логическими порциями.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
15.07.2004, 15:03 | #11 |
Участник
|
Цитата:
Изначально опубликовано Андре
Прежде всего, считаем, что данные отображаются не из датасета, а скажем вычисляются на лету, так как в противном случае выбор ListView на таком большом наборе данных мне кажется сомнительным решением. Лучше уж временную таблицу... Еще раз напомню - ListView полностью живет в свопе на клиентской машине. Хоть застрелитесь, но он будет жить именно там. |
|
15.07.2004, 15:05 | #12 |
Moderator
|
Цитата:
Изначально опубликовано Maxim Gorbunov
В принципе, все уже есть для этого. Сделайте на форме DataSource, который будет привязан к нужной таблице. Данные из него берите с помощью getFirst(0, false)/getNext()... Я имел в виду случай, когда пользователь из интерфейса накладывает условия на возвращаемый набор данных, тем самым сужая возвращаемый набор данных. |
|
15.07.2004, 15:57 | #13 |
Участник
|
Цитата:
Изначально опубликовано Андре
Я имел в виду случай, когда пользователь из интерфейса накладывает условия на возвращаемый набор данных, тем самым сужая возвращаемый набор данных. На ListView придется самостоятельно еще и фильтрацию писать. |
|
15.07.2004, 16:21 | #14 |
Moderator
|
Цитата:
На ListView придется самостоятельно еще и фильтрацию писать.
Надо просто очистить listView и загрузить новые item-ы. А вообще, с ListView удобно работать в случаях, когда данные получаются не тупым копированием из БД. Например следующая ситуация: мы считываем некие параметры из БД, на основании их в памяти вычисляем большой набор новых данных, которые хотим предоставить пользователю. В данном случае я не вижу смысла сохранять их в БД и отображать через Grid - гораздо проще отобразить их через ListView. При этом возможны случаи, что таких данных может быть очень много и не стоит их все сразу отображать в listView. |
|
15.07.2004, 18:19 | #15 |
Участник
|
Мне кажется, что с ListView можно работать только в одном случае - если данных будет гарантировано мало. Во всех остальных случаях стоит подумать о таблицах.
Цитата:
Изначально опубликовано Андре
Например следующая ситуация: мы считываем некие параметры из БД, на основании их в памяти вычисляем большой набор новых данных, которые хотим предоставить пользователю. А можно пример задачи, который стоит решать именно таким образом? |
|
15.07.2004, 18:43 | #16 |
Moderator
|
Цитата:
А можно пример задачи, который стоит решать именно таким образом?
Допустим в процессе вычисления мы получили(а не считали из БД) map(Type::Container, Type::Real): [фамилия, имя, отчество] -> сумма. При этом надо пользователб показать информацию Фамилия : Сумма. Цитата:
А при фильтрации перевычислять?
Например на форме у нас есть ListView и ComboBox, содержащий первую букву фамилии. Перекрываем change() comboBox, в нем делаем listView.clear(); а затем пробегаясь по map-у выводим туда новую информацию. p.s. Примеры и структуры данных придуманы только что и служат лишь для примерного описания возможности применения.. |
|
15.07.2004, 18:59 | #17 |
Участник
|
понял...
но опять же нужен еще и map. который в свою очередь опять в свопе на клиенте живет... |
|
16.07.2004, 10:01 | #18 |
Moderator
|
Цитата:
но опять же нужен еще и map.
Тогда без особых проблем можно будет заменить, как хранилище данных (например, map на container или врем. таблицу), так и их отображение (listView на Table или Grid). Цитата:
который в свою очередь опять в свопе на клиенте живет...
Во-вторых, по ним действительно очень быстро работает поиск. Посмотри, все длительные алгоритмы используют map-ы - сводное планирование, закрытие склада. И потом, а какую альтернативу предлагаешь ты ? Засунуть все в БД ? Лишь для того, чтобы отобразить пользователю в Grid ? А как же траффик, а как же нагрузка не сервер ? У этого метода есть один недостаток - плохая масштафируемость. Если ожидается, что количество данных, которые придется хранить в map'е возрастет на несколько порядков, то соответственно и возрастет требования к оперативной памяти на клиенте - этот момент следует учитывать. |
|
03.08.2004, 14:04 | #19 |
Участник
|
Если вспомнить WinAPI, то ListView поддерживает так называем виртуальный список, вывод на экран при этом будет очень быстр (т.к. отображаются только те данные которые видны), но у клиента в памяти или на диске в файле все равно будет полный набор данных.
|
|
03.08.2004, 14:40 | #20 |
Moderator
|
Я про это писал:
Цитата:
Можно подумать про virtual listview - в котором данные будут подгружаться по мере их отображения - но это уже много программирования.
Цитата:
Изначально опубликовано mega_guest: Если вспомнить WinAPI, то ListView поддерживает так называем виртуальный список, вывод на экран при этом будет очень быстр (т.к. отображаются только те данные которые видны), но у клиента в памяти или на диске в файле все равно будет полный набор данных.
Virtual listView - это нечто другое. ListView владеет некоторой областью памяти, в которой хранит данные для отображения. И суть в том, чтобы заполнять эту память не сразу всеми данными, которые когда-либо могут отобразиться, а постепенно - по мере отображения нужных элементов, как правило в onPaint(). При этом мы избегаем загрузки элементов, котоорые могут быть не отображены. Как ты правильно сказал, WinApi поддерживает listView, но это поддержку нужно реализовывать ручками По идее, это даже не фича отдельного контрола, а один из элементов концепции "Data-Model", когда мы отделяем данные от их представления. Аналогичным образом реализуются Virtual TreeView, Virtual Grid и т.д. |
|