Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
26.02.2015, 16:54
|
|||
---|---|---|---|
Сортировка в Lisview (.Net,объектный, details ) |
|||
#18+
Один раз давно занимался Вот вставил сейчас. Public lvwColumnSorter As ListViewColumnSorter ... Инициализация грубо: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Класс ListViewColumnSorter (как есть сейчас): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
Щелчки по столбцам(грубо). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Предварительно мне нравится как это работает. Пока такие вопросы соображения 1) Как мне лучше изменить мой ListViewColumnSorter класс (спойлер выше) чтоб иметь возможность сортировать по дата/время. Так понимаю задать параметр SortMethod (string/date) и в зависимости от него использовать разные Compare в "Function Compare"? Не подскажете как лучше? Примеры смотрел, не везде кстати CaseInsensitiveComparer используется. Как бы его вообще соптимизировать по скорости? 2) Насколько хороша эта "автоматика"? Я так понимаю что нек. время затрачивается на инициализацию ListViewColumnSorter а при добавлении записи уже втыкаются на свое место. Т.е. не будет ли это тормозить при добавлении большого к-ва записей. Для сравнения, подобная сортировка "c API Listview" занимает время при каждом .Sort(), тычки по столбцам в этой модели занимают нулевое время. Поэтому в API я делал Sort() только при необходимости (при загрузке списка и при щелчках по столбцам, новые записи тупо добавлял вверх списка). Как -то надо в это врубиться в общем, потом уже миллисекунды считать и оптимизировать. P.S. Не стал писать в соседнюю тему, замусорили ее сильно, хотя это к ней относится. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.02.2015, 00:38
|
|||
---|---|---|---|
Сортировка в Lisview (.Net,объектный, details ) |
|||
#18+
Дмитрий77, 1) Как мне лучше изменить мой ListViewColumnSorter класс (спойлер выше) чтоб иметь возможность сортировать по дата/время. Так понимаю задать параметр SortMethod (string/date) и в зависимости от него использовать разные Compare в "Function Compare"? Не подскажете как лучше? Примеры смотрел, не везде кстати CaseInsensitiveComparer используется. Как бы его вообще соптимизировать по скорости? Модернизировал чуть добавив TypeOfSort (String/Date) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Всякие CDate, IsDate -работают очень медленно, особенно если вызывать их по несколько раз при каждом сравнении. Генерировать Try/Catch как - в нек. документациях примеры видел -это вообще жопа полная. Поэтому с учетом опыта воспользовался простенькой API-реализацией VarDateFromStr Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
В случае ошибки hResult<>S_OK DateFromString быстро вернет пустую дату "0:00:00", что не вызовет исключений и не помешает сортировке. Здесь небольшая просадка по скорости из за того что передаю в VarDateFromStr sDateIn As String (ну а как иначе из объектной то модели, в VB6 я передавал hMem -указатель на память). Но с лихвой компенсируется тем, что DateTime.Compare работает очень быстро в отличии от Format$ (DateFromString(hMem), "yyyymmddhhmmss")) который я использовал в VB6. Во всяком случае в .Net такой "Format" дает тормоза. Ну т.е. в итоге я получил около 280мс при сортировке 10000 записей по столбцу с дата/время в .Net-Listview против 170-190мс для 6500 записей в API-Listview. 15067121 Тоже самое -считаю результат удовлетворительным. m-m-m..API-тест перепроверить бы надо, при том тесте комп был другой, более старый.... На всякий случай прилагаю свой ListViewColumnSorter, как он есть сейчас. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108.
2) Насколько хороша эта "автоматика"? Я так понимаю что нек. время затрачивается на инициализацию ListViewColumnSorter а при добавлении записи уже втыкаются на свое место. Т.е. не будет ли это тормозить при добавлении большого к-ва записей. Для сравнения, подобная сортировка "c API Listview" занимает время при каждом .Sort(), тычки по столбцам в этой модели занимают нулевое время. Поэтому в API я делал Sort() только при необходимости (при загрузке списка и при щелчках по столбцам, новые записи тупо добавлял вверх списка). Насчет нулевого времени это я погорячился. Вполне конечное - типа значений что привел выше. Если держать Listview отсортированным т.е с привязанным к нему lvwColumnSorter, то при добавлении в отсортированный 10000 записей он рискует уже не проснуться. Надо вызывать сортировку только при необходимости, например после полной загрузки списка или при щелчке по столбцу. Часто встречаемые примеры кода, где каждый раз вызывается New ListViewColumnSorter() без сохранения этого New не прокатили. "Ручная" сортировка делается так: Код: vbnet 1. 2. 3. 4.
Ну и до кучи, если например полностью обновлять содержимое (кнопка Refresh), то вот такие хорошие команды например Код: vbnet 1. 2. 3. 4. 5.
Продолжая начатую тему, предварительно я объектной .Net моделью Listview доволен, просадка скорости по сравнению с API если и есть, то 10-15% не более, это не критично и думаю можно чуть оптимизировать при желании. === P.S. Гораздо большие тормоза дает позднее связывание ADODB при чтении из БД. Счас пока разбираюсь с ранним связыванием. Плюс еще какие-то мелкие ф-ции типа IsDate, IsDbNull, Format и т.п. скорость просаживают. Т.е. получается при тестовой загрузке 10000 строк в ListView API: 2050мс -из них 1450мс -работа с ListView включая сортировку по датам, 600мс - чтение из БД и т.п. Net: 3800мс -из них 1650мс -работа с ListView включая сортировку по датам, 2150мс - чтение из БД и т.п. Позднее связывание adodb жрет секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1401858]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 126ms |
0 / 0 |