几个月前我被介绍给 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/