現代瀏覽器生成乙個 JS 函式的開銷多大?React hooks 的設計頻繁生成新函式對效能有影響嗎

時間 2021-05-06 19:39:51

1樓:鍾凱

事實上這個問題已經得到了完美的解決,可以了解concent:

setup提公升api為靜態定義,online demohttps://

codesandbox.io/s/concent-guide-xvcej

2樓:年少無為

arguments 在進入執行上下文時就生成了,後續的每一次重複呼叫都沒有引起 hooks 的 AO 的任何變化。變化的只是function 函式內部的變數(閉包訪問),而這個在函式元件執行時已經生成了。所以優化點不在這。

3樓:行甫

看函式語句長度,實際上開銷並不大,特別是帶有jit的v8引擎,編譯速度和執行速度都非常快。

通常來說,編譯過一次的函式,使用之後不直接丟棄,而是快取在記憶體中,下次再執行這個函式,就跳過編譯,直接執行。

但有一點需要注意,JS是弱型別語言,經常會不經意之間寫出各種型別資料相互轉換,而v8引擎實現語言是強型別,各種型別資料不能隨意裝換。

例如某個函式,裡面有個變數,它有可能是整數,有可能是個字串,有可能是引用了物件。當它是整數時,函式編譯執行後快取下來,若下次它變成了字串,之前快取的函式編譯就不能用了,需要重新編譯。

所以如果有個函式被呼叫量非常大,那在編寫函式時一定要規避這種隨意的資料轉換寫法。

有時候,typescript編譯的JS執行會更快,原因之一就是ts的強資料型別審查,讓函式內的資料型別不會隨意變換,也就能享受函式編譯一次後快取下來的優化。

4樓:丟貓

生成的不是函式而是乙個object/struct,通過動態繫結執行函式。一些情況下可以靜態繫結或者inline函式消去動態派發/函式呼叫的開銷。

5樓:Kaid Wong

有。比如解釋階段的作用域解析(scope resolution),及執行時的閉包反覆生成與執行,都會帶來額外開銷。

不過現代瀏覽器目前都對這些場景做了優化,比如針對作用域解析的內部函式省略(skipping inner function),和針對閉包呼叫的回饋向量(feedback vector)。

因此,理論上謹慎使用閉包(避坑),額外的開銷都能控制在理想範圍(最好自己做對應的基準測試)。

乙個統一的瀏覽器核心 vs 多個瀏覽器競爭,哪一種對 Web 發展更有利?

愛讀書的路人甲 即使只有一家,新舊版本之間依然會有相容問題。所以從減少相容性的角度來說,一家和多家並沒有什麼區別。而如果只有一家,那麼所謂的國際標準其實就是乙個企業標準了。在這個標準制定過程中,會不會涉及到專利?你猜!另外,從安全角度來說,如果只有一家,那麼當他爆出0Day的時候,你有可用的替代品嗎...

java如何實現同乙個瀏覽器同的乙個系統只能登入乙個賬號,如果登入了第二個,第乙個賬號自動登出?

zhangs1314 樓主的意思可能是在同乙個瀏覽器裡面的不同的標籤頁,訪問了同乙個專案,後面登入進去的賬號,把前面登入進去的賬號踢掉.以前俺的做法,一般是用ws協議做長連線.每乙個長連線的唯一標記是乙個sessionId.登入的時候,先判斷是否有sessionId被儲存過.如果有,伺服器向這個se...

海豚瀏覽器會是下乙個 UC 嗎?為什麼?

梁晨 嘗試過一段時間的海豚感覺到的亮點就是定義網頁的特定表達方式來導航這個功能我覺得只能作為乙個bonus 但卻起不到吸引使用者忠誠度的作用打個比方我換了手機就不會想到主動的去裝海豚而不像我每台新電腦都會選擇chrome這樣載入速度是核心競爭力不知道手機瀏覽器裡這個成長的空間有多少但不太看好海豚 恐...