Đầu tiên, tôi vừa tạo cho mình một biểu thức chính quy sẽ khớp với tất cả các đường dẫn thư viện bên ngoài duy nhất trong danh sách tất cả các tệp tiêu đề trong một dự án. Tôi đã hỏi một câu hỏi liên quan đến việc tạo regexp đó một tuần trước.
Tôi bắt đầu can thiệp xung quanh để xem nó sẽ hoạt động như thế nào khi không đồng bộ và khi được chuyển thành nhân viên web. Để thuận tiện và đáng tin cậy, tôi đã tạo tệp chung này chạy ở cả ba chế độ:
/** Will call result() callback with every match it founds. Asynchronous unless called
* with interval = -1.
* Javadoc style comment for Arnold Rimmer and other Java programmers:
*
* @param regex regular expression to match in string
* @param string guess what
* @param result callback function that accepts one parameter, string match
* @param done callback on finish, has no parameters
* @param interval delay (not actual interval) between finding matches. If -1,
* function will be blocking
* @property working false if loop isn't running, otherwise contains timeout ID
* for use with clearTimeout
* @property done copy of done parameter
* @throws heavy boulders
**/
function processRegex(regex, string, result, done, interval) {
var m;
//Please tell me interpreter optimizes this
interval = typeof interval!='number'?1:interval;
//And this
processRegex.done = done;
while ((m = regex.exec(string))) {
Array.prototype.splice.call(m,0,1);
var path = m.join("");
//It's good to keep in mind that result() slows down the process
result(path);
if (interval>=0) {
processRegex.working = setTimeout(processRegex,
interval, regex, string,
result, done, interval);
// Comment these out for maximum speed
processRegex.progress = regex.lastIndex/string.length;
console.log("Progress: "+Math.round(processRegex.progress*100)+"%");
return;
}
}
processRegex.working = false;
processRegex.done = null;
if (typeof done=="function")
done();
}
processRegex.working = false;
Tôi đã tạo một tệp thử nghiệm, thay vì dán nó ở đây, tôi đã tải nó lên lưu trữ web rất đáng tin cậy: Demo - Dữ liệu thử nghiệm .
Điều tôi thấy rất ngạc nhiên là có một sự khác biệt đáng kể giữa web worker và trình duyệt thực thi RegExp. Kết quả tôi nhận được:
- Mozilla Firefox
[WORKER]: Time elapsed:16.860s
[WORKER-SYNC]: Time elapsed:16.739s
[TIMEOUT]: Time elapsed:5.186s
[LOOP]: Time elapsed:5.028s
Bạn cũng có thể thấy rằng với biểu thức chính quy cụ thể của tôi, sự khác biệt giữa vòng lặp đồng bộ và không đồng bộ là không đáng kể. Tôi đã cố gắng sử dụng danh sách đối sánh thay vì biểu thức nhìn trước và kết quả đã thay đổi rất nhiều. Dưới đây là những thay đổi đối với chức năng cũ:
function processRegexUnique(regex, string, result, done, interval) {
var matchList = arguments[5]||[];
... same as before ...
while ((m = regex.exec(string))) {
... same as before ...
if (matchList.indexOf(path)==-1) {
result(path);
matchList.push(path);
}
if (interval>=0) {
processRegex.working = setTimeout(processRegex, interval,
regex, string, result,
done, interval, matchList);
... same as before ...
}
}
... same as before ...
}
Và kết quả:
- Mozilla Firefox
[WORKER]: Time elapsed:0.062s
[WORKER-SYNC]: Time elapsed:0.023s
[TIMEOUT]: Time elapsed:12.250s
(lưu ý với bản thân: nó trở nên kỳ lạ hơn mỗi phút)[LOOP]: Time elapsed:0.006s
Bất cứ ai có thể giải thích một sự khác biệt về tốc độ?