Вот версия вашего кода, которая сочетает в себе следующие улучшения производительности:
- Добавлять в innerHTML только один раз в конце цикла.Вы хотите избегать делать это так часто, как только можете, потому что каждый раз, когда вы добавляете в него элемент, происходит повторная обработка всего HTML-кода в этом элементе.Это минимизирует количество транзакций с DOM, которое может быть самой медленной частью всей процедуры.Эта улучшенная версия значительно сокращает количество транзакций DOM.Если
jItems.length
было 20
, а среднее количество видео было 5, это сократило бы количество транзакций DOM до 1/50 числа транзакций DOM. - Скопируйте строковые данные в массив с
.push()
и делать .join()
в самом конце, вместо того, чтобы каждый раз добавлять в конец строки.Механизм JS часто может объединять множество строк одновременно гораздо эффективнее, чем объединять каждый фрагмент по частям. - При накоплении строковых данных в массивах больше нет необходимости инициализировать временные значения в каждом цикле или подцикле..
- Вместо того, чтобы получить
pList
и затем иметь четыре ссылки на pList.name
, просто получите значение имени один раз и используйте его напрямую. - Кэш
jItems[i]
в цикле, потому что на него ссылаютсяв нескольких местах, а не пересчитывать его каждый раз. - Вычислить переменную len для каждого цикла
for
только один раз и сравнить с ней, а не пересчитывать ее на каждой итерации. - Cache
jItems[i]["videos"]
один разво внешнем цикле, а не повторять его каждый раз во внутреннем цикле. - Если в
jsonData.items
содержится большое количество элементов, алгоритм сортировки не очень эффективен, так как он должен пересчитывать нижний регистрверсия каждого имени для каждого сравнения.Вы можете предварительно собрать все строчные версии за один проход (один раз для каждого элемента), а затем просто использовать их в алгоритме сортировки, а не повторять их каждый раз при сравнении двух элементов.
Эти изменения приводят кэтот код:
function list_response(jsonData) {
"use strict";
var lists = document.getElementById("lists"), anchors = document.getElementById("anchors"), jItems = jsonData.items;
var results = [], anks = [], vList, pListName, item, videoItem;
// precache all lower case versions to make sorting faster
var i, iLen = jItems.length, j, jLen;
for (var i = 0; i < iLen; i++) {
jItems[i].nameLower = jItems[i].name.toLowerCase();
}
jItems.sort(function (a, b) {
return a.nameLower.localeCompare(b.nameLower);
});
for (i = 0; i < iLen; i++) {
item = jItems[i]; // cache for use in loops
videoItem = item["videos"]; // cache for use in loops
pListName = item.name; // cache for use in multiple places
results.push('<span class="backtotop">[ <a href="#">Back to top</a> ]</span><br /><br /><br /><li class="title nodot"><a class="pHeader" name="' + pListName + '"><h2>' + pListName + '</h2></a></li>');
anks.push('<a class="pHeader" href="#' + pListName + '">' + pListName + '</a> ');
for (j = 0, jLen = videoItem.length; j < jLen; j++) {
vList = videoItem[j];
results.push('<li class="nodot"><a href="https://www.site.org/videos/Video_Player.page?bctid=' + vList.id + '">' + vList.name + '</a></li>');
}
}
lists.innerHTML += results.join("");
anchors.innerHTML += anks.join("");
}