node.js - 在 NodeJS 中使用 "New"

标签 node.js

几个月前我被介绍给 NodeJS。我想学习足够的知识来编写一个可以处理中等负载的有用应用程序。我正在花时间学习电子书、网站和代码。我的背景是各种语言的休闲编程,包括 PHP。我一直在查看各种可用 Node 包的源代码,只是为了学习和查看最佳实践。特别是一些可用的各种 websocket 包。我注意到 NodeJS 作者倾向于使用面向对象的方法来构建他们的代码,以便动态实例化对象,例如:

var wsRequest = new WebSocketRequest(someParams);
var wsConnection = new WebSocketConnection(someParams);
var wsFrame = new WebSocketFrame(someParams);

请求产生连接,连接产生帧。

作为 OOP 的优势,这对我来说是合乎逻辑的。但是在过去,我用其他语言编写的此类程序的类实例创建速度很慢。一次,或者按照用户输入的速度。不过,在这里,复杂对象的创建速度要快得多,根据网站的负载,可能每秒数百甚至更多。此外,我认为垃圾收集器必须努力工作以清理垃圾。我的问题是,编写 Node 应用程序的程序方法是否会比在服务器回调中自由使用“new”、动态创建复杂对象更高效?或者与 OOP 的优势相比,任何优势都是微不足道的。

最佳答案

如果使用原型(prototype)*,这些对象非常便宜。查看语法 - 如果您不小心,您可能会在其他函数中创建函数,这些函数每次都会创建非常昂贵的对象。

最坏的罪犯是这样的:

function something() {
     var a;
     var b = function() {
         use(a);
     }.bind(this);
}

每次调用something()你创建一个函数对象,一个闭包,然后绑定(bind)函数。所有这些总成本很容易 25-50 普通的轻量级对象,如 WebSocketFrame .您甚至可以循环执行上述操作。

如果他们不使用原型(prototype),则为每个实例的每个方法创建一个函数对象,垃圾量将为 大量 确实。

一些数字:
object        32-bit                      64-bit

normal        12+4 for each field         24+8 for each field
function      36                          72
closure       70                          140
bound-closure 300                         600

例如一个具有 5 个字段和 30 个使用原型(prototype)实现的方法的类:
12 + 4*5 = 32 bytes per instance

如果没有使用原型(prototype)实现:
12 + 4*5 + 30 * 36 = 1112 bytes per instance (or 2224 on 64-bit)

在规范的 PHP 实现中,对象被实现为哈希表,因此速度很慢。如果您通常在 JS 中使用构造函数、原型(prototype)和对象,它们将更像 C++ 和 Java 对象——实际上,其 header 仅比 HotSpot 中的 Java 对象大 4 个字节。

关于node.js - 在 NodeJS 中使用 "New",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830128/

相关文章:

javascript - 带有 Express 和 Jade 模板的 Node.js 不显示 Leaflet.js map

arrays - MongoDB/NodeJS:遍历查询参数

javascript - 来自同一个 require(jsfile) 的多个导出类

node.js - Nodemailer - 错误 : Missing credentials for "PLAIN" at SMTPConnection. _formatError

node.js - n <version> 命令不激活指定版本

angularjs - 了解 Nodejs 和 Angular 中的密码重置

node.js - Flutter Socket io 几秒钟后断开连接

node.js - 带有不记名策略的passport-azure-ad veriy msal.js token

node.js - Node 错误:EADDRINUSE,我如何找出哪个进程正在锁定该地址?

javascript - 为什么 CommonJS 的 require 函数不是异步的?