2011-12-28 32 views
34

Firefox 9.0.1 làm tôi ngạc nhiên khi hiển thị thuật toán đệm số Ω (log n) của tôi với phương thức vòng lặp Ω (n) khi n nhỏ. In every other browser I've seen, the loop is slower, ngay cả đối với các giá trị nhỏ của n. Tôi biết tất cả các trình duyệt đang làm việc để tối ưu hóa JS, nhưng vì tất cả các trình duyệt hiện đại khác đang hiển thị vòng lặp chậm hơn, có giải thích nào về hành vi trong Firefox 9 không?Firefox đã tối ưu hóa vòng lặp này như thế nào?

// Ω(log n) 
function padNumberMath(number, length) { 
    var N = Math.pow(10, length); 
    return number < N ? ("" + (N + number)).slice(1) : "" + number 
} 

// Ω(n): 
function padNumberLoop(number, length) { 
    var my_string = '' + number; 
    while (my_string.length < length) { 
     my_string = '0' + my_string; 
    } 
    return my_string; 
} 

Cập nhật: Tôi không nghĩ rằng đây có liên quan đến câu hỏi ban đầu, nhưng tôi chỉ phát hiện ra rằng IE 9 công tắc hành vi khi chuyển đổi từ 32 đến chế độ 64-bit. Ở chế độ 32 bit, phương thức Math sẽ thắng. Trong chế độ 64 bit, phương thức Loop sẽ thắng. Chỉ nghĩ rằng tôi nên chỉ ra điều đó.

Cập nhật 2: MAK bắt gặp tôi trong nhận xét của mình bên dưới. Phương thức toán học không phải là Ω (1), nó có thể giống như Ω (log n).

+5

Phương thức nào là phương pháp Ω (1)? Tôi không biết thuật toán lũy thừa nào nhanh hơn O (log n). – MAK

+0

Chìa khóa ở đây là nó chỉ xảy ra đối với các giá trị nhỏ của n. Tôi cho rằng có một số loại bỏ vòng lặp xảy ra khi n nhỏ, dẫn đến kết quả O (1). Nếu họ tiếp tục tối ưu hóa chuỗi nối trong một vòng lặp, điều này thậm chí có thể nhanh hơn. Chỉ nhìn vào mã sẽ cung cấp câu trả lời thực sự, mặc dù. – jknupp

+0

Bạn có thể giả định, nhưng bạn có thể cung cấp bất kỳ bằng chứng nào cho * show * rằng có việc bỏ vòng lặp đang diễn ra không? –

Trả lời

11

Nhìn vào the results của nó khá rõ ràng rằng Firefox đã không làm bất cứ điều gì để đạt được một hiệu suất tăng.

browserscope

Những quán bar có thể được đọc là "tốc độ" (hoạt động/giây) để thanh lớn hơn là tốt hơn. Mọi thứ đều có quy mô.

Trong Firefox 9, phương pháp "Toán" rất rõ ràng thực hiện quá trình ngầm, trong khi có ít thay đổi trong phương thức "Vòng lặp" giữa các phiên bản.

Vì vậy, đã có không"tối ưu hóa" của bất kỳ loại trong Firefox 9. Tất cả những gì đã xảy ra giữa Firefox 8 và 9 đối với những thử nghiệm với là bằng cách nào đó thư viện toán học của họ đã chậm hơn (Math.pow bị chậm), hoặc họ thư viện chuỗi bị chậm hơn (.slice() bị chậm).

Nhìn vào này hơn nữa, thì rõ ràng somehow these elementary operations got a bit slower in ff9:

ff8 vs ff9

Cả nối và Math.pow là chậm hơn một chút trong FF 9 hơn trong FF 8, có thể giải thích cho sự khác biệt mà bạn nhìn thấy trong bạn kiểm tra.

Thú vị, thanh không có mới mới dài hơn nhiều trong FF8 so với FF9.

+0

Ồ, có vẻ như một lỗi sẽ được mở ra? Tôi đã đánh giá một số mã của tôi trên Firefox 9 và có vẻ như cải thiện 30% từ Loại suy luận mà họ tuyên bố chủ yếu là chính xác ... nhưng mã của tôi không phải là môn toán nặng –

+2

Đã mở [lỗi] (https: //bugzilla.mozilla .org/show_bug.cgi? id = 713875) – kojiro

+1

Câu trả lời hay. :) –

0

Firefox 9.0.1 làm tôi ngạc nhiên bằng cách hiển thị thuật toán đệm số with (1) của tôi bằng phương pháp vòng lặp Ω (n) khi n nhỏ.

Câu đó không thiếu một số phần? Nó được hiển thị là đang nhanh hơn, hoặc một cái gì đó? Và tại sao bạn đang ghép nối trống String s đến Number s? Tại sao không chỉ xây dựng một String?

Và yeah, O (1) thực sự là O (log) ...

Anyways, lời giải thích có lẽ là do Type Inference trong Firefox 9

+1

"hiển thị" có nghĩa là "đã làm tốt hơn", như trong "Tôi đã ghi được 9 điểm, nhưng Péter Varga chỉ cho tôi bằng cách ghi 11 điểm". Không chắc đó là ý nghĩa của OP, nhưng đó là cách tôi giải thích nó. –

+3

"hiển thị" được sử dụng theo nghĩa khác với "xuất hiện" ở đây. ông đang sử dụng "để hiển thị" để có nghĩa là "để chứng minh cấp trên". http://idioms.thefreedictionary.com/show+up – jela

+0

@jela Thật vậy, đó là cách tôi muốn nói. – kojiro

3

Nó có thể nhanh chóng một arraycopying tham số chuỗi thành một mảng char mới, có lẽ là theo mặc định được khởi tạo thành một ký tự có liên quan, trong trường hợp này là một chữ số.

Có lẽ một cái gì đó về việc nhận ra phép gán đệ quy liên quan đến hằng số cho phép nối nhanh chuỗi dài-mystring.length + 1 '0 với bí ẩn.

Cách khác, nó có thể đơn giản như việc số mũ của Firefox trở nên sloppier hơn khi không sử dụng mở rộng nhị phân của số mũ để lặp lại bình phương.

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