簡體   English   中英

為什么 Boolean() 在 Javascript 中這么慢?

[英]Why is Boolean() so slow in Javascript?

根據 ECMAScript 規范,一元邏輯 NOT 運算符( ! ) 和Boolean()函數都使用內部函數ToBoolean() ,NOT 運算符也執行一些檢查以反轉結果。 那么為什么雙重邏輯 NOT 運算比運行Boolean()函數快得多呢?

我使用以下代碼來測試哪個更快:

 function logicalNotOperator() { var start = performance.now(); for (var i = 0; i < 9999999; i++) !!Math.random(); return 0.001 * (performance.now() - start); } function booleanFunc() { var start = performance.now(); for (var i = 0; i < 9999999; i++) Boolean(Math.random()); return 0.001 * (performance.now() - start); } var logicalNotOperatorResult = logicalNotOperator(); var booleanFuncResult = booleanFunc(); var diff = booleanFuncResult - logicalNotOperatorResult; console.log('logicalNotOperator:', logicalNotOperatorResult); console.log('booleanFunc:', booleanFuncResult); console.log('diff:', diff);

注意:我指的不是new Boolean()構造函數,而是Boolean()函數,它強制將其提供給布爾值的參數。

雖然Boolean將調用該函數(內部優化),但大多數 JIT 將內聯 double 而不使用 XOR,這要快得多( 源代碼參考- JägerMonkey)。

和 JSperf: http ://jsperf.com/bool-vs-doublenot

我不知道 Javascript JIT 編譯器是如何在內部執行的。 現在布爾函數在 2020 年在 Chrome 中運行得更快。但是如果有一些不同的瀏覽器,不同的版本或不同的 JS 引擎!! 操作員工作得更快我想我知道答案的原因。 當您調用一個函數時,內存中有額外的工作用於推送堆棧和彈出堆棧。 當您使用! (NOT operator) ! (NOT operator)無需在內存中為推送/彈出堆棧創建額外的工作。 這就是 NOT 運算符工作得更快的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM