我正在开发一个基于Web的文档搜索/查看系统,用于为客户提供服务。该系统的一部分是搜索系统,允许客户搜索包含在文档中的术语[s]。我已经创建了必要的搜索数据文件,但需要加载大量数据,加载所有数据需要8-20秒。数据分成40-100个文件,具体取决于需要搜索哪些文档。每个文件大小在40-350kb之间。
此外,该应用程序必须能够在本地文件系统上运行,也可以通过Web服务器运行。
当网页加载完成后,我可以生成需要加载的所有搜索数据文件列表。在网页可以被认为是功能完善之前,必须加载整个列表。
在介绍完这些背景信息之后,让我们看看我现在的做法。
当我知道整个网页都已经加载完成后,我调用一个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个元素。
看起来两种数据加载方法的CPU利用率大致相同。我感到惊讶的是,由于数据结构在预先创建,我本以为第二种方法需要很少的CPU时间。
请指教?