2013-02-17 22 views
2

我有這樣的代碼:爲什麼concat空字符比.toString()更快?

var boo = 123123; 

我想這個數字轉換爲字符串,並conact串比本地JavaScript 的ToString()更快:

更快

var foo = boo + ""; 

較慢

var foo = boo.toString(); 

jsPerf:http://jsperf.com/concat-string-vs-tostring

爲什麼的ToString()比concating空字符慢?最後我想知道的是,使用+ ""技術而不是.toString()的正確方法?

+0

我期望看到Number原型的函數調用的開銷比加號操作符的內置字符串串聯重載要慢。 – 2013-02-17 07:10:09

+3

是的,它是完全有效的,儘管在腳本的執行時間中應該考慮可讀性比微秒更重要。 – 2013-02-17 07:15:37

+0

@FabrícioMattéAFAIK所有的Java程序員都使用'boo +「」'!你認爲這不是人類可讀的嗎? – 2013-02-17 07:17:11

回答

2

結果將取決於所使用的JavaScript引擎。在鉻上,我得到了和Afshin相同的結果。

那麼爲什麼一個人比另一個人慢呢?這是因爲在toString上會有更多的V8內部的C函數調用。你可以下一個試試,看看是自己:在鍍鉻

  • 打開空標籤(以避免從已經打開的網頁任何副作用)
  • 開放開發工具
  • 打開配置文件選項卡,並開始新的配置文件
  • 轉到控制檯選項卡並插入script1腳本,按回車。
  • 再去簡介和停止剖析
  • 重複同樣的用script2

  • 腳本1:var boo = 123123; var foo = boo + "";

  • 腳本2:var boo = 123123; var foo = boo.toString();

在我的情況下首先將導致在下一個堆棧跟蹤中:

InjectedScript.evaluate 
    InjectedScript._evaluateAndWrap 

,而第二個:

InjectedScript.evaluate 
    InjectedScript._evaluateAndWrap 
     InjectedScript._evaluateOn 
     evaluate 

我認爲它更具有發動機內部比官方JS規範做,可能會進行優化,使用相同的代碼路徑。

相關問題