什么时候在Node.js V8中分配和编译闭包?

罗宾·罗德里克斯

根据我目前对虚拟机及其行为的假设,我估计每次命中闭包定义时都会分配并编译闭包。与在闭包外部声明的函数相反,这些函数只被分配和编译一次(因为它们被放置在其定义的某个位置,因此仅被命中一次)。这个假设正确吗?

因此,如果我在中有一个闭包socket.on('data', function (data) {...}),则每次套接字接收到数据,V8都会分配新的内存(并可能重新编译)该闭包

贝吉

我估计每次命中闭包时都会分配和编译闭包

并不真地。闭包只编译一次,但是每次命中它们的定义时都会分配最重要的是,您必须区分分配和编译。

  • 每个函数的代码(即在源代码中的相同位置)仅被编译一次,即使该函数在不同的环境中被多次实例化也是如此。
    对每个实例进行编译都是毫无意义的,就像为每个调用进行编译毫无意义一样(尽管这实际上是“解释器”所做的,并且边界是可变的,例如对于懒散的编译,它不会在每次编译之前就发生)。第一次致电)。
    如果代码成为优化的候选者,或者优化失败并且必须取消优化,则可能会再次编译代码(使用速度较慢但功能更复杂的编译器)。但这不是重点。

  • 每个函数在定义时都会被分配/实例化,这与本地函数(嵌套在其他函数中)特别相关。
    非封闭函数的分配成本为零,因为不需要存储环境指针,因此不需要实例对象。

因此,如果我在中有一个闭包socket.on('data', function (data) {...}),则每次套接字接收到数据,V8都会分配新的内存(并可能重新编译)该闭包?

不是function (data) {…},它仅实例化一次并传递给on调用。

但是,是的,如果您在部分中实例化了一个闭包,那么每次接收到数据并调用处理程序时,该闭包都会分配一些内存。但是不必担心,内存分配既便宜又快速。

如果您正在寻找技术细节,我建议您阅读http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html(即使已经使用了几年)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么时候应该在Node.js中创建Redis客户端?

来自分类Dev

在什么时候命令行输入被解析为node.js中的process.argv?

来自分类Dev

什么时候应该在独立的node.js上使用express.js

来自分类Dev

我什么时候应该使用yield和何时在Koa.js中使用yield *

来自分类Dev

我什么时候应该使用yield和何时使用Koa.js的yield *

来自分类Dev

在React JS中,什么时候应该使用商店而不是直接操纵视图的状态?

来自分类Dev

什么时候使用js框架?

来自分类Dev

是否需要处理node.js域?什么时候应该做?

来自分类Dev

什么时候应该在node.js mysql中使用连接池?

来自分类Dev

我什么时候应该打开/关闭与数据库的连接?(MariaDB / node.js)

来自分类Dev

什么时候应该在node.js mysql中使用连接池?

来自分类Dev

什么时候应该使用struct node * head = NULL和struct node * head = NULL?

来自分类Dev

什么时候在C程序中分配和使用内存?

来自分类Dev

什么时候必须编译C / C ++?

来自分类Dev

什么时候必须编译C / C ++?

来自分类Dev

=什么时候执行比较而不是分配?

来自分类Dev

什么时候为程序分配内存?

来自分类Dev

猫鼬__v什么时候改变

来自分类Dev

猫鼬__v什么时候改变

来自分类Dev

什么时候使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?

来自分类Dev

count ++和++ count,什么时候使用?

来自分类Dev

什么时候使用mapParitions和mapPartitionsWithIndex?

来自分类Dev

count ++和++ count,什么时候使用?

来自分类Dev

什么时候使用.jar和.exe?

来自分类Dev

什么时候应该使用<或<()或<<和>或>()?

来自分类Dev

什么时候在postgreSQL中使用=和:=?

来自分类Dev

在什么时候在RxJava中创建线程

来自分类Dev

什么时候在Android中“杀死”视图?

来自分类Dev

什么时候在MySQLdb中关闭游标?

Related 相关文章

  1. 1

    什么时候应该在Node.js中创建Redis客户端?

  2. 2

    在什么时候命令行输入被解析为node.js中的process.argv?

  3. 3

    什么时候应该在独立的node.js上使用express.js

  4. 4

    我什么时候应该使用yield和何时在Koa.js中使用yield *

  5. 5

    我什么时候应该使用yield和何时使用Koa.js的yield *

  6. 6

    在React JS中,什么时候应该使用商店而不是直接操纵视图的状态?

  7. 7

    什么时候使用js框架?

  8. 8

    是否需要处理node.js域?什么时候应该做?

  9. 9

    什么时候应该在node.js mysql中使用连接池?

  10. 10

    我什么时候应该打开/关闭与数据库的连接?(MariaDB / node.js)

  11. 11

    什么时候应该在node.js mysql中使用连接池?

  12. 12

    什么时候应该使用struct node * head = NULL和struct node * head = NULL?

  13. 13

    什么时候在C程序中分配和使用内存?

  14. 14

    什么时候必须编译C / C ++?

  15. 15

    什么时候必须编译C / C ++?

  16. 16

    =什么时候执行比较而不是分配?

  17. 17

    什么时候为程序分配内存?

  18. 18

    猫鼬__v什么时候改变

  19. 19

    猫鼬__v什么时候改变

  20. 20

    什么时候使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?

  21. 21

    count ++和++ count,什么时候使用?

  22. 22

    什么时候使用mapParitions和mapPartitionsWithIndex?

  23. 23

    count ++和++ count,什么时候使用?

  24. 24

    什么时候使用.jar和.exe?

  25. 25

    什么时候应该使用<或<()或<<和>或>()?

  26. 26

    什么时候在postgreSQL中使用=和:=?

  27. 27

    在什么时候在RxJava中创建线程

  28. 28

    什么时候在Android中“杀死”视图?

  29. 29

    什么时候在MySQLdb中关闭游标?

热门标签

归档