2014-05-07 16 views
13

Trong bluebird docs, họ có điều này như một chất chống mẫu mà dừng tối ưu hóa .. Họ gọi nó là luận rò rỉ,Liệu node.js có thực sự không tối ưu hóa các cuộc gọi tới [] .slice.call (đối số) không?

function leaksArguments2() { 
    var args = [].slice.call(arguments); 
} 

Tôi làm điều này mọi lúc trong Node.js. Đây thực sự là một vấn đề. Và, nếu có, tại sao?

Giả sử chỉ phiên bản mới nhất của Node.js.

+0

Điểm mà họ đang cố gắng thực hiện là các đối số rất quan trọng để tối ưu hóa V8. Với cách bạn có thể thay đổi [đối số trong hàm] (http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) theo các cách tương tự pass-by-reference, điều này có nghĩa là V8 phải kiểm tra lại các chữ ký đã tồn tại một lần nữa.Vì V8 này sẽ không bao giờ có thể đoán được các kiểu dữ liệu để tối ưu hóa các cuộc gọi chức năng. – user568109

+0

@ user568109 một số sử dụng 'đối số' được hỗ trợ bởi trình biên dịch tối ưu hóa - những đối tượng không yêu cầu đối tượng' đối số 'đã được vật chất hóa, chẳng hạn như đối số [i] hoặc arguments.length (trong đó i là chỉ số hợp lệ) – Esailija

+0

Có, đã đề cập sử dụng an toàn ở cuối phần 3 của [tài liệu] (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments). – user568109

Trả lời

-2

Đây có phải là thực sự là một vấn đề

Đối với mã ứng dụng, không có. Đối với hầu hết bất kỳ mã mô-đun/thư viện nào, không. Đối với một thư viện như bluebird được dự định sẽ được sử dụng phổ biến trong toàn bộ một codebase, vâng. Nếu bạn đã làm điều này trong một chức năng rất nóng trong ứng dụng của bạn, sau đó có thể có.

Tôi không biết chi tiết nhưng tôi tin tưởng các tác giả bluebird đáng tin cậy khi truy cập arguments theo cách được mô tả trong tài liệu khiến v8 từ chối tối ưu hóa chức năng, và do đó nó là điều mà các tác giả bluebird coi là đáng sử dụng macro thời gian xây dựng để có được phiên bản được tối ưu hóa.

Chỉ cần ghi nhớ số liệu độ trễ đã tăng lên nút ở vị trí đầu tiên. Nếu ứng dụng của bạn thực hiện những điều hữu ích như nói chuyện với cơ sở dữ liệu hoặc hệ thống tập tin, thì I/O sẽ là nút cổ chai của bạn và tối ưu hóa/lưu trữ/song song chúng sẽ trả cổ tức cao hơn nhiều so với mức tối ưu hóa vi mô trong bộ nhớ v8.

+0

Không biết chi tiết về câu hỏi hỏi * tại sao * không hữu ích. Bạn chỉ đang dùng nó trên đức tin rằng việc tối ưu hóa này trong bluebird là cho Node, và không phải cái gì khác. Hoặc, nó thậm chí còn hoạt động. –

+0

Tôi biết đây không phải là câu trả lời toàn diện mà bạn có thể hy vọng và tôi hy vọng một người khác sẽ đăng câu trả lời như vậy. Nó không phải là "đức tin" nhưng nó thực sự dựa vào các tài liệu bluebird khá rõ ràng về v8 nói riêng. Để cho dù nó hoạt động ở tất cả, cho đại diện của bạn, bạn rõ ràng có khả năng viết 2 .js tập tin để chứng minh/bác bỏ rằng sự hài lòng của riêng bạn. Bạn nên làm rõ cho dù bạn có nghĩa là "tại sao v8 từ chối tối ưu hóa các chức năng này" vs "tại sao đây là một mối quan tâm hiệu suất". Câu trả lời trước đây thường là "họ chưa tìm ra cách an toàn". –

12

Disclaimer: Tôi là tác giả của trang wiki

Đó là một vấn đề nếu chức năng chứa được gọi rất nhiều (là nóng). Các hàm bị rò rỉ arguments không được trình biên dịch tối ưu hóa (trục khuỷu) hỗ trợ.

Thông thường khi chức năng nóng, nó sẽ được tối ưu hóa. Tuy nhiên, nếu chức năng chứa các tính năng không được hỗ trợ như rò rỉ arguments, là một chức năng nóng không giúp đỡ và nó sẽ tiếp tục chạy mã chung chung chậm.

Hiệu suất của hàm được tối ưu hóa so với hàm chưa được tối ưu hóa là rất lớn. Ví dụ, xem xét một hàm có thêm 3 đôi với nhau: http://jsperf.com/213213213 21x khác biệt.

Điều gì xảy ra nếu nó được thêm 6 đôi với nhau? 29x difference Nói chung mã càng có nhiều chức năng, thì hình phạt càng nghiêm trọng đối với chức năng đó để chạy ở chế độ không được tối ưu hóa.

Đối với nội dung node.js như thế này nói chung thực sự là một vấn đề lớn do thực tế là bất kỳ thời gian CPU nào hoàn toàn chặn máy chủ. Chỉ cần by optimizing the url parser được bao gồm trong lõi nút (mô-đun của tôi nhanh hơn 30 lần trong tiêu chuẩn của nút), cải thiện yêu cầu mỗi giây của mysql-express từ 70K rps lên 100K rps trong điểm chuẩn queries a database.

Tin tốt là node core is aware of this

+0

Làm cách nào tôi có thể biết điều gì đang nóng hay không? Liệu wikipage đó là nguồn tài nguyên duy nhất về điều này? Điều này hoàn toàn mới đối với tôi. Chưa bao giờ nghe nói về điều này. Trên thực tế, tôi có các bản vá để gửi tại đây. Đây là những thứ khá thô sơ mà tôi đã làm sai - và [một số người mà tôi coi là tốt hơn tôi nhiều] (https://github.com/visionmedia/node-thunkify/pull/12) –

+1

@EvanCarroll "chức năng nóng" có nghĩa là một chức năng được gọi là rất nhiều, bạn biết những chức năng được gọi là rất nhiều bằng cách có một sự hiểu biết của chương trình, bằng cách sử dụng profilers hoặc quầy và như vậy. – Esailija

+0

aww, tôi nghĩ nóng có nghĩa là tối ưu trong ngữ cảnh này. Câu hỏi vẫn còn, là có một nguồn có thẩm quyền hơn về những gì có thể tối ưu hóa trong V8 so với trang wiki cho bluebird? Có mô tả ở bất kỳ đâu trong% GetOptimizationStatus 1-6 và ý nghĩa của chúng chính xác không và nguyên nhân gây ra những trạng thái đó. –

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