2016-09-26 20 views
7

tôi cần phải chạy mã này trên WebKit, đó là một phần của một ứng dụng lai cho android:tại sao Firefox chạy mã này 10x nhanh hơn so với Chrome

for(var x = 0; x < width; x++) { 
    for(var y = 0; y < height; y++) { 
     var i = (y * width + x) * 3; 
     var r = data[i]; 
     var g = data[i + 1]; 
     var b = data[i + 2]; 
     var green = is_green(r, g, b); 
     x_histogram[x] += green; 
     y_histogram[y] += green; 
    } 
} 

Ở đây có đầy đủ code để kiểm tra: https://jsbin.com/boduputebu/edit?js,console

Tôi nghĩ V8 nhanh hơn Firefox (SpiderMonkey), nhưng ở đây cho mã đơn giản này SpiderMonkey nhanh hơn đáng kể. Trên máy tính xách tay của tôi hiệu suất là:

Chrome: 30 ms 
Node: 30 ms 
Firefox: 3 ms 
Java (same code with Java): 3 ms 

Bạn có ý tưởng thay đổi mã để làm cho nó nhanh trên V8 không. Với hiệu suất hiện tại, tôi đã phải viết nó ở phía Java, nhưng nó không phải là một lựa chọn tốt cho tôi. Hoặc nếu không có cách nào để làm cho nó nhanh hơn bạn có biết tại sao V8 chạy mã này rất chậm?

Version:

Chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" 
FireFox: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0" 
+0

Mặc dù sự khác biệt nhỏ hơn (8-9 so với 2,5-3 mili giây), tôi có thể [sao chép] (https://jsbin.com/nexocopuka/1/edit?js,console) điều này. Hấp dẫn. – Cerbrus

+1

FF không bận rộn để thu thập dữ liệu meta của bạn nhiều như Chrome? – Teemu

+0

Bạn có muốn giải thích kỹ thuật về nội bộ động cơ JavaScript hay chỉ sửa chữa mã của bạn? –

Trả lời

4

mã nhanh chóng n bẩn này đã nhanh hơn đáng kể trong v8. (~ 24ms cho bộ dữ liệu 1000x1000)

var calc_histogram = function() { 
    for(var x = 0; x < width|0; x++) { 
     for(var y = 0; y < height|0; y++) { 
      var i = ((y * width + x) * 3)|0; 
      var r = data[i]|0; 
      var g = data[i + 1]|0; 
      var b = data[i + 2]|0; 
      var green = ((g > 80) && (g > (r + 35)|0) && (g > (b + 35)|0))|0; 
      x_histogram[x] += green|0; 
      y_histogram[y] += green|0; 
     } 
    } 
}; 

| 0 đảm bảo rằng số là một số nguyên, là kỹ thuật asm js. Gọi một mảng với một số yêu cầu để đảm bảo nó là một số nguyên, sử dụng | 0 làm cho nó rõ ràng.

EDIT: Và đây là cách nhanh nhất mà tôi quản lý để nhận mà không cần thiết | 0. ~ 4ms cho 500x500 và ~ 11 cho 1000x1000. Lưu ý rằng tôi đã đảo ngược các vòng lặp để nó đọc dữ liệu theo thứ tự để tận dụng lợi thế của prefetch, và tôi cũng đã sử dụng một tập dữ liệu lớn hơn để cải tiến đáng chú ý.

+0

Bạn chỉ cần sử dụng 'var green = ((g> 80) && (g> (r + 35) | 0) && (g> (b + 35) | 0)) | 0;'. Phần còn lại của '| 0' là không đáng kể. Tuy nhiên, tốt lắm. – Cerbrus

+0

@Cerbrus bạn đã đánh giá nó chưa? Tôi đã thử nó đầu tiên sau đó tôi thấy cải thiện hơn nữa với những người khác | – bokan

+0

Yea, [Tôi đã làm] (https://jsbin.com/sowohefile/2/edit?js,console). Sự khác biệt giữa '| 0' chỉ trong dòng đó, và khi nó nằm trên các dòng khác như wel, rất không đáng kể. – Cerbrus

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