2012-12-04 29 views
8

Tôi đã thấy trình biên dịch Đóng cửa của Google thực hiện rất nhiều việc viết lại trong các mệnh đề if. Ví dụ:Tại sao Google Closure hoán đổi đối số?

if (a === 3) {…} 

quay sang

if (3 === a) {…} 

Are so sánh nhanh hơn trong JavaScript, nếu nguyên thủy là đối số đầu tiên, hoặc lý do cho điều này là gì?

+8

Google thích Yoda :) –

+0

Có thể bạn nên hỏi rằng ở đây: https://groups.google.com/forum/?fromgroups#!forum/closure-compiler-discuss –

+1

Nếu có bất kỳ lợi ích hiệu suất nào , nó là không đáng kể, ít nhất là trong Chrome: http://jsperf.com/yoda –

Trả lời

16

Từ ReorderConstantExpression.java:

/** 
* Reorder constant expression hoping for a better compression. 
* ex. x === 0 -> 0 === x 
* After reordering, expressions like 0 === x and 0 === y may have higher 
* compression together than their original counterparts. 
* 
*/ 

Như đã trình bày bởi một google closure compiler contributor, nén mã ý kiến ​​được đề cập đến nén gzip phương tiện, không phải là việc rút gọn thực tế "nén". Lý do nó có thể cải thiện nén gzip là nếu bạn có 0 === xx === 0 trong mã của mình, trình biên dịch đóng cửa chuẩn hóa cả hai loại này thành 0 === x, văn bản trùng lặp và do đó nén tốt hơn.

Sau đó, cũng là:

typeof this.value == "object" 

typeof this.key == "object" 

Các chuỗi độc đáo là: typeof this., value, key== "object"

Nhưng nếu bạn sắp xếp lại:

"object" == typeof this.value 

"object" == typeof this.key 

Các chuỗi độc đáo là: "object" == typeof this. , valuekey. Ít chuỗi duy nhất và một bản sao khá dài.

+0

Tuyệt vời, tốt đẹp nhất. Người ta có thể ước ao cho một mô tả đầy đủ hơn (trong bình luận, không phải từ bạn), nhưng ít nhất có * cái gì đó * ở đó. –

+0

+1 để khai thác nghiêm trọng –

+2

+1. Tôi yêu phần mã nguồn cho biết nó mở rộng 'AbstractPeepholeOptimization' :) –

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