簡體   English   中英

何時在Node.js V8中分配和編譯閉包?

[英]When are closures allocated and compiled in Node.js V8?

根據我目前對虛擬機及其行為的假設,我估計每次命中閉包定義時都會分配並編譯閉包。 與在閉包外部聲明的函數相反,這些函數只被分配和編譯一次(因為它們被放置在其定義的某個位置,因此僅被命中一次)。 這個假設正確嗎?

因此,如果我在socket.on('data', function (data) {...})有一個閉包, socket.on('data', function (data) {...}) 每次套接字接收到數據時,V8都會分配新的內存(並可能重新編譯)該閉包?

我估計每次命中閉包時都會分配和編譯閉包

並不是的。 閉包只編譯一次 ,但是每次命中它們的定義時都會分配。 最重要的是,您必須區分分配和編譯。

  • 每個函數的代碼(即在源代碼中的相同位置)僅被編譯一次,即使該函數在不同的環境中被多次實例化也是如此。
    對每個實例進行編譯都是毫無意義的,就像為每個調用進行編譯毫無意義一樣(盡管這實際上是“解釋器”所做的,並且邊界是可變的,例如對於懶散的編譯,它不會在每次編譯之前發生)。第一次致電)。
    如果代碼成為優化的候選者,或者優化失敗並且必須取消優化,則可能會再次編譯代碼(使用速度較慢但功能更復雜的編譯器)。 但這不是重點。

  • 每個函數在定義時都會被分配/實例化,這與本地函數(嵌套在其他函數中)特別相關。
    非封閉函數的分配成本為零,因為不需要存儲環境指針,因此不需要實例對象。

因此,如果我在socket.on('data', function (data) {...})有一個閉包, socket.on('data', function (data) {...})每次套接字接收到數據時,V8都會分配新的內存(並可能重新編譯)該閉包?

不是function (data) {…} ,它僅實例化一次並傳遞給on調用。

但是,是的,如果您在部分中實例化了一個閉包,那么每次接收到數據並調用處理程序時,該閉包都會分配一些內存。 但是不必擔心,內存分配既便宜又快速。

如果您正在尋找技術細節,我建議您閱讀http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html (即使已經使用了幾年)。

根據我目前對虛擬機及其行為的假設,我估計每次命中閉包定義時都會分配並編譯閉包。

與在閉包外部聲明的函數相反,這些函數只分配和編譯一次。

false,它們每次在定義被命中時也會被編譯,但是它們通常被放置在僅定義被命中一次的地方。
閉包被設計為多次定義,並且每次都包含不同的變量/值。
這就是我們區分這是一個簡單/匿名函數還是一個閉包的方式

每當套接字接收到數據時,V8都會分配新的內存

不,該匿名函數只編譯一次,然后傳遞給事件處理程序。 現在,事件處理程序對此函數進行了引用,並在每次接收到數據時調用它。

添加事件偵聽器時,此示例中的定義也僅被命中一次。

暫無
暫無

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

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