У меня есть система поиска и просмотра документации на основе Интернета, которую я разрабатываю для клиента.Частью этой системы является поисковая система, которая позволяет клиенту искать термин (и), содержащийся в документации.У меня созданы необходимые файлы поисковых данных, но нужно загрузить много данных, и загрузка всех данных занимает от 8 до 20 секунд.Данные разбиты на 40-100 файлов, в зависимости от того, какую документацию нужно искать.Каждый файл имеет размер от 40 до 350 КБ.
Кроме того, это приложение должно быть в состоянии работать как в локальной файловой системе, так и через веб-сервер.
Когда веб-страница загружается, я могу создать список файлов с данными поиска, которые мне нужно загрузить.Весь этот список должен быть загружен, прежде чем веб-страницу можно будет считать работоспособной.
Учитывая это предисловие, давайте посмотрим, как я это делаю сейчас.
После того, как я узнаю, чтозагружается вся веб-страница, я вызываю функцию loadData ()
function loadData(){
var d = new Date();
var curr_min = d.getMinutes();
var curr_sec = d.getSeconds();
var curr_mil = d.getMilliseconds();
console.log("test.js started background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
recursiveCall();
}
function recursiveCall(){
if(file_array.length > 0){
var string = file_array.pop();
setTimeout(function(){$.getScript(string,recursiveCall);},1);
}
else{
var d = new Date();
var curr_min = d.getMinutes();
var curr_sec = d.getSeconds();
var curr_mil = d.getMilliseconds();
console.log("test.js stopped background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
}
}
Это последовательно обрабатывает массив файлов с интервалом в 1 мс между файлами.Это помогает предотвратить полную блокировку браузера во время процесса загрузки, но браузер все еще имеет тенденцию зависать при загрузке данных.Каждый из загружаемых файлов выглядит следующим образом:
AddToBookData(0,[0,1,2,3,4,5,6,7,8]);
AddToBookData(1,[0,1,2,3,4,5,6,7,8]);
AddToBookData(2,[0,1,2,3,4,5,6,7,8]);
Где каждая строка - это вызов функции, которая добавляет данные в массив.Функция «AddToBookData» просто выполняет следующие действия:
function AddToBookData(index1,value1){
BookData[BookIndex].push([index1,value1]);
}
Это существующая система.После загрузки всех данных «AddToBookData» можно вызывать более 100 000 раз.
Я подумал, что это довольно неэффективно, поэтому я написал скрипт для файла test.js, который содержит все вызовы функций, приведенные выше, иобработал его, чтобы превратить в гигантский массив, равный структуре данных, создаваемой BookData.Вместо того, чтобы делать все вызовы функций, которые делала старая система, я просто делаю следующее:
var test_array[..........(data structure I need).......]
BookData[BookIndex] = test_array;
Я ожидал увидеть повышение производительности, потому что я удалял все вызовы функций выше, этот метод занимает немногобольше времени, чтобы создать точную структуру данных.Я должен отметить, что в моем тесте «test_array» содержится чуть более 90 000 элементов.
Кажется, что оба метода загрузки данных имеют примерно одинаковую загрузку ЦП.Я был удивлен, обнаружив это, поскольку ожидал, что второй метод потребует небольшого процессорного времени, так как структура данных создается заранее.
Пожалуйста, посоветуйте?