2011-12-06 18 views
5

Tôi đã sử dụng một số mã để trích xuất các giá trị 16 bit chưa ký từ một chuỗi.Javascript - hiệu suất kém trong V8 của các hàm được thêm vào String.prototype?

tôi phát hiện ra rằng việc thêm chức năng này để nguyên mẫu cho String:

String.prototype.UInt16 = function(n) { 
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1); 
}; 

là chậm hơn nhiều so với chỉ có một chức năng mà phải mất một String như một tham số:

var UInt16 = function(s, n) { 
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1); 
}; 

Trong Firefox là sự khác biệt chỉ là một yếu tố của hai, nhưng trong Chrome 15 nó là một trăm lần chậm hơn!

Xem kết quả tại http://jsperf.com/string-to-uint16

bất cứ ai có thể hiến dâng cho một lời giải thích cho điều này, và/hoặc cung cấp một cách thay thế của việc sử dụng nguyên mẫu mà không có hit hiệu suất?

+3

http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3 có thể làm sáng tỏ. Đó là một chút thành công. –

+0

@CrescentFresh, xem câu trả lời của tôi, nó vẫn còn chậm hơn rất nhiều và không phải "trong vòng 1%" như tuyên bố trong chủ đề khi sử dụng các đối tượng ... Hoặc có lẽ tôi làm điều đó sai? – Esailija

+0

@Esailija: Tôi không thấy mối quan hệ của câu trả lời của bạn cho câu hỏi. Các bổ sung của bạn vào các trường hợp thử nghiệm chỉ hiển thị (như nhóm thảo luận của google) lưu một tham chiếu đến đối tượng 'String' cho kết quả nhanh hơn khi gọi các phương thức prototyped trên đối tượng đó so với gọi phương thức tương tự trên nguyên thủy. Vấn đề cơ bản mà OP đang cố gắng giải quyết phải làm với sự ép buộc kiểu ngầm khi đấm một nguyên thủy đến một đối tượng nhiều lần. –

Trả lời

1

Truy cập nguyên mẫu từ nguyên thủy (vì nó không phải là đối tượng) chậm hơn nhiều so với truy xuất nguyên mẫu từ một đối tượng.

http://jsperf.com/string-to-uint16/2

10x nhanh hơn trong chrome và 2x nhanh hơn trong firefox cho tôi.

Có một nút cổ chai thực sự trong việc sử dụng nguyên mẫu không? Nó vẫn còn rất nhanh nếu bạn không cần hàng triệu ops mỗi giây. Nếu bạn cần, sau đó chỉ cần sử dụng một chức năng.

0

Alnitak, tôi đã thực hiện nhanh jsperf test (mà tôi vô tình xuất bản) và cho thấy rằng các nguyên mẫu cho loại người dùng không chậm hơn. Khi xem xét các động cơ như V8 hoạt động như thế nào, có nghĩa là việc biên dịch Java sẽ hoạt động rất khác nhau khi thêm mã vào các đối tượng dựng sẵn.

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