2012-12-04 22 views
8

Google Closure derleyicisini if-cümlelerinde yeniden yazma işlemini gördüm. Örneğin:Google Closure neden argüman değiştiriyor?

if (a === 3) {…} 

ilkel İlk argüman, ya bunun nedeni ne ise,

if (3 === a) {…} 

daha hızlı JavaScript karşılaştırmalar Are döner? ReorderConstantExpression.java itibaren

+8

Google seviyor Yoda :) –

+0

Muhtemelen burada sormak daha iyi olurdu: https://groups.google.com/forum/?fromgroups#!forum/closure-compiler-discuss –

+1

Herhangi bir performans avantajı varsa , en azından Chrome'da göz ardı edilebilir: http://jsperf.com/yoda –

cevap

16

:

/** 
* 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. 
* 
*/ 

bir google closure compiler contributor tarafından belirtildiği gibi, kod yorumlar araçlar gzip sıkıştırma başvuruyorsunuz sıkıştırma değil, gerçek küçültme "sıkıştırma". Gzip sıkıştırmasını geliştirebilmemizin nedeni, kodunuzda 0 === x ve x === 0 varsa, kapama derleyicisinin her ikisini de yinelenen metin olan ve daha iyi sıkıştıran 0 === x'a normalleştirmesidir.

Sonra da vardır:

typeof this.value == "object" 

typeof this.key == "object" 

benzersiz dizeleri

şunlardır: typeof this., value, key ve == "object"

Ama yeniden düzenlemek durumunda:

"object" == typeof this.value 

"object" == typeof this.key 

benzersiz dizeleri

şunlardır: "object" == typeof this. , value ve key. Daha az benzersiz dizeler ve oldukça uzun bir kopyası.

+0

Mükemmel, güzel bir tane. Biri daha dolu bir açıklama için (sizden değil, sizden) istediler, ama en azından orada * bir şey var. –

+0

+ 1. Kaynak kodunun "AbstractPeepholeOptimization" yazdığını söyleyen kısmı seviyorum :) –

+2

+1 ciddi kazıcı için –

İlgili konular