Ось кілька оптимізацій, які ви можете застосувати, щоб прискорити роботу. Просто думаючи вголос.
Оскільки кількість рядків може бути мільйонами, вам потрібна система кешування лише для даних JSON з сервера. Я не можу собі уявити, щоб хто-небудь захотів завантажити всі X мільйони предметів, але якби це було, це буде проблемою. Цей невеликий тест на Chrome для масиву на 20M + цілих чисел постійно виходить з ладу на моїй машині.
var data = [];
for(var i = 0; i < 20000000; i++) {
data.push(i);
}
console.log(data.length);
Ви можете використовувати LRU або якийсь інший алгоритм кешування і мати верхню межу щодо кількості даних, які ви готові кешувати.
Для самих комірок таблиці я думаю, що побудувати / знищити DOM-вузли може дорого. Натомість ви можете просто заздалегідь визначити кількість X комірок, і щоразу, коли користувач прокручується до нового положення, вводите дані JSON у ці комірки. Панель прокрутки практично не має прямого відношення до того, скільки місця (висоти) потрібно для представлення всього набору даних. Ви можете довільно встановити висоту контейнера таблиці, скажімо, 5000px, і зіставити їх із загальною кількістю рядків. Наприклад, якщо висота контейнерів становить 5000 пікселів і в цілому є 10 М рядків, то starting row ≈ (scroll.top/5000) * 10M
де scroll.top
представлено відстань прокрутки від верхньої частини контейнера. Тут невелика демонстрація .
Щоб визначити, коли потрібно запитувати більше даних, в ідеалі об'єкт повинен виступати посередником, який слухає події прокрутки. Цей об'єкт відслідковує, наскільки швидко користувач прокручується, і коли схоже на те, що користувач сповільнюється або повністю зупинився, робить запит даних для відповідних рядків. Отримання даних таким чином означає, що ваші дані будуть фрагментовані, тому кеш повинен бути розроблений з урахуванням цього.
Також важлива роль може відігравати обмеження браузера щодо максимальних вихідних з'єднань. Користувач може прокрутити до певної позиції, яка запустить запит AJAX, але перед цим завершення користувач може прокрутити до якоїсь іншої частини. Якщо сервер не реагує достатньо, запити будуть чергуватися, і програма виглядатиме невідповідно. Ви можете використовувати диспетчер запитів, за допомогою якого проводяться всі запити, і він може скасувати очікувані запити, щоб звільнити місце.