2013-06-16 30 views
6

Tôi tự hỏi tại sao cùng một mã JavaScript chậm hơn đáng kể trong một add-on FireFox (sử dụng Add-on SDK) hơn là chạy trực tiếp trong một trang web được tải trong FireFox.Tại sao JavaScript chậm hơn trong chương trình bổ trợ FireFox so với một trang web được tải trong FireFox?

Ví dụ, mã này:

function isPrime(number) { 
    var i, 
     prime = true; 
    for(i = 2 ; i < number ; ++i) { 
     if(number % i === 0) { 
      prime = false; 
     } 
    } 
    return prime; 
} 

function sumFirstPrimeNumbers(x) { 
    var i, 
     sum = 0; 
    for(i = 1 ; i <= x ; ++i) { 
     if(isPrime(i)) { 
      sum += i; 
     } 
    } 
    return sum; 
} 

var sum = sumFirstPrimeNumbers(15000); 

console.log(sum); 

mất ít hơn 2 giây để chạy trong một trang web mở trong FireFox, nhưng mất khoảng 15 giây để chạy trong một FireFox add-on.

Tôi biết mã có thể tốt hơn, nhưng nó chỉ là một ví dụ để cho biết tốc độ của nó.

Tại sao ứng dụng này chậm trong tiện ích bổ sung FireFox?

Có cách nào để làm cho nó nhanh hơn (không thay đổi mã này kể từ khi nó được, như tôi đã nói ở trên, chỉ có một ví dụ)?

Cập nhật:

Có vẻ như có liên quan đến các Add-on SDK. Tôi đã làm một thử nghiệm khác: Tôi đã thực hiện cùng một mã trong một phần bổ sung không sử dụng SDK bổ sung và mã thực thi trong khoảng 3 giây.

Tại sao sự khác biệt lớn như vậy (3 giây so với 15 giây) giữa một tiện ích bổ sung bằng cách sử dụng SDK bổ trợ và tiện ích bổ sung không sử dụng nó?

+0

Khi được mã được chạy? Vì trình duyệt bị tải nặng vì nó đã khởi động? –

+0

Tôi có thể nói một điều ngu ngốc, và chắc chắn ai đó sẽ bác bỏ tôi, nhưng có thể trang web "lưu trữ" kết quả của 'isPrime' trong khi phần bổ trợ không? –

+0

Mã này đã được tải khi trình duyệt khởi động. Nhưng tôi đã cố gắng chạy mã này trên một nút bấm và nó là chậm. Và tôi không biết nếu có bất kỳ bộ nhớ cache nào. – antoyo

Trả lời

1

Có hai sở thích (truy cập từ trang about:config) điều khiển tối ưu hóa javascript: javascript.options.methodjit.chrome cho mã đặc quyền (phần mở rộng) và javascript.options.methodjit.content cho mã không tin cậy (trang web).

Một số phiên bản của tàu Firefox đã bị vô hiệu hóa theo mặc định.

Kiểm tra javascript.options.methodjit.chrome để xem nó được đặt thành true hay không.

+2

câu trả lời này cần thêm chi tiết. xin vui lòng giải thích cho OP những gì tùy chọn này pref nào, làm thế nào để tìm thấy nó, vv Nếu không, vì nó là viết tắt, câu trả lời nên là một bình luận chứ không phải là một câu trả lời. – Spudley

+0

Điều đó đúng. Nó có nghĩa là gì? – antoyo

+0

@antoyo Điểm cơ bản là JIT JavaScript (hoặc ít nhất một trong số đó; có một số trong Firefox kích hoạt tại các điểm khác nhau) có thể bị vô hiệu hóa một cách độc lập trong các phần mở rộng và trong các trang web. Vì vậy, có thể là mã trong trang web đang được JITted và mã trong phần mở rộng là không. –

Các vấn đề liên quan