3

我的優化SHA-256> HMAC> PBKDF2加密算法在javascript鉻鉻的JavaScript優化魔淵

http://jsfiddle.net/dtudury/uy3hc/

如果我改變一行(註釋// BREADCRUMB後)ei = (di + t1) >>> 0;ei = (di + t1);我測試還通過,但是測試運行時從< 1S跳到7S

我相信>>> 0告訴它應該值存儲爲(實際)INT鉻......但有一定程度的「貨物邪教」的吧。

我的問題是:「這是在任何地方記錄?」我很想驗證這是如何工作和/或找到一個零操作的方式來告訴chrome有關整數(以及任何其他祕密方式來預測chrome js編譯器這樣的文檔會顯示)

謝謝!

回答

3

總體原則是,Chrome/V8試圖弄清楚你的代碼是否一直處理特定類型(如整數),並針對該情況進行優化。有關於網絡上的Javascript JIT策略的一些帖子和演示文稿...例如herehere

在這個特定的情況下,我的猜測是它是一個錯誤。首先,我不能在node.js中重現它。此外,用(di + t1)|0~~(di+t1)等其他常見的int-casting「類型提示」代替(di + t1)>>>0似乎並不能改善Chrome中的內容。最後,使用--js-flags="--trace-opt --trace-deopt --code-comments"運行Chrome可以看出,在緩慢的情況下,_hashWords正在進行優化並重新優化了幾十次,這可能會使得它比根本沒有嘗試優化更慢。 (我猜這是CPU的抖動)。有趣的是,提供去優化的原因是shift-i,這聽起來像編譯器一直假設數字不是整數,然後每遇到一個整數移位指令就會感到驚訝。

要回答您的具體問題,Chrome編譯事物的確切方式未記錄在案,但一般原則以及分析和調試性能問題的方法是。 Here's我最喜歡的系列文章 - 它是由在Dart-to-JS編譯器上工作的人編寫的。

編輯:衛生署,我只是意識到>>> 0被轉換成一無符號 INT,而|0~~強制轉換爲符號的int。這可能是Chrome V8無法正確解析類型的原因。

+0

什麼是一個簡潔的可讀答案的豐富的信息...它是明確的,可操作的,比我希望的要好得多,謝謝! – dtudury