2011-05-22 43 views
5

在JavaScript中,我自己的仿真器實現方式中,從一個32位指令i越來越寄存器字段RA的值通常表示爲:在JavaScript中'inlining'?

this.gpr.u32[(i >> 16) & 0x1f] 

然而,具有上述表達式多次在一個功能是難看並很難遵循和編輯。我避免用該表達式定義變量ra並使用它,因爲我認爲它將被存儲在內存中,並且獲取它將是昂貴的。我應該爲此擔心還是現代JavaScript引擎將變量的值「嵌入」到定義後面的語句中?雖然使用變量會使代碼更清潔,但如果它會在仿真器等性能敏感的環境中減慢執行時間,我並不想使用它。

回答

6

答案中有很多「它取決於」。首先它取決於JavaScript解釋器如何優化它。

不過,如果我理解正確,你的代碼是一樣的東西

.... this.gpr.u32[(i >> 16) & 0x1f] ... 
.... this.gpr.u32[(i >> 16) & 0x1f] ... 
.... this.gpr.u32[(i >> 16) & 0x1f] ... 

,而不是

ra = this.gpr.u32[(i >> 16) & 0x1f]; 
.... ra .... 
.... ra .... 
.... ra .... 

在這種情況下,我想任何JavaScript引擎將執行速度更快了後者。確實,你在內存中有一個額外的變量ra。但訪問ra應該不會比訪問i加移位和掩碼加上訪問this.gpr.u32慢。

+0

謝謝!所以你所說的是,任何不必要的'ra'訪問延遲都會因爲獲取'i'的不必要的訪問延遲,做一個轉換,做一個AND,然後從'this.gpr中獲取一個項目而被大大超出。 u32',假設長表單不會被引擎自動緩存。 – 2011-05-22 09:26:22

+0

@Delan Azabani:或多或少。一個引擎比一個整體表達式更容易嵌入單個變量,因此我懷疑大多數引擎在前者中要好得多。 – Howard 2011-05-22 09:28:14

+0

再次感謝。你的回答非常有幫助。 – 2011-05-22 09:29:30