几个月前我接触到了 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 对象 - 实际上仅比 HotSpot 中的 Java 对象大 4 个字节。
关于node.js - 在 NodeJS 中使用 "New",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830128/