1

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

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

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

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

4

1 回答 1

0

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

最坏的罪犯是这样的:

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

每次调用时,something()您都会创建一个函数对象、一个闭包然后绑定函数。所有这些总共花费了25-50个普通的轻量级物体,例如WebSocketFrame. 您甚至可以循环执行上述操作。

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


一些数字:

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 个方法的类,用原型实现:

12 + 4*5 = 32 bytes per instance

如果没有使用原型实现:

12 + 4*5 + 30 * 36 = 1112 bytes per instance (or 2224 on 64-bit)

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

于 2013-11-07T15:45:40.483 回答