Как выясняется, проблема скорее в механизмах JavaScript на стороне клиента, чем в данных, с которыми я работаю. Я провел большую часть дня, сравнивая процессы и рассчитывая время выполнения различных операций.
Все быстро работает в Chrome. В Firefox все работает довольно быстро (не так быстро, как Chrome). Реальным отставанием в производительности является Internet Explorer.
Когда я загружаю весь набор данных - все 200 строк - Flexigrid пытается выполнить некоторую постобработку для каждой ячейки в таблице . Как вы можете видеть на скриншоте, каждая строка имеет 29 ячеек ... поэтому мы просматриваем кучу операций форматирования в общей сложности 5800 раз.
Мне удалось вытащить некоторые из более дорогих операций (например, создание объектов jQuery) из низкоуровневого цикла ячеек, чтобы они выполнялись только один раз в строке, но в конечном итоге я все еще сталкиваюсь с производительностью, связанной с IE вопросы.
Чтобы дать вам некоторые реальные тесты, я установил код, показывающий общее время до того, как он достигнет определенных событий:
populate
срабатывает, когда браузер впервые отправляет запрос XHR
addData
срабатывает после возврата запроса и до синтаксического анализа объекта JSON
addCellProp
срабатывает после первоначального анализа данных и выполняет итерацию по каждой ячейке таблицы
done
срабатывает, когда все закончено
Обработка 20 строк данных (по умолчанию):
------------------------------------------------------
| browser | populate | addData | addCellProp | done |
------------------------------------------------------
| Chrome | 0 | 84 | 123 | 286 |
| IE9 | 0 | 151 | 309 | 799 |
| IE8 | 0 | 226 | 481 | 1105 |
Обработка полного набора данных (179 строк на этом аппарате):
------------------------------------------------------
| browser | populate | addData | addCellProp | done |
------------------------------------------------------
| Chrome | 0 | 318 | 669 | 1963 |
| IE9 | 0 | 157 | 1813 | 9428 |
| IE8 | 0 | 229 | 2188 | 13335 |
Самая дорогая операция - от addCellProp
до done
. Я прошел и сделал код максимально эффективным, но вы можете сделать так много всего, когда выполняете столько итераций набора данных, особенно при манипулировании DOM.
Я изменил Flexigrid (несмотря на многие рекомендации, чтобы этого не делать), чтобы как можно меньше касаться DOM, и это на самом деле ускорило процесс. Когда я начал это исследование, IE9 потребовалось от 20 до 30 секунд, чтобы попасть в событие done
.
К сожалению, правда в том, что не все платформы созданы равными, и IE, похоже, не лучший механизм для работы с данными на дисплее таким образом.
Лучшим подходом может быть создание и управление таблицей HTML на стороне сервера и отправка всей информации (разметки и всего) в браузер по запросу пользователей IE, а не в зависимости от IE для создания разметки из необработанного JSON объект.