典型的例子是 RoBrowser 如何处理每个传入/传出数据包。
首先,RoBrowser为每个数据包使用类,有数千个数据包,每次接收或发送它们时都会实例化它们。
数据包定义为 here 。我们以#L2681
为例:
// 0x204
PACKET.CA.EXE_HASHCHECK = function PACKET_CA_EXE_HASHCHECK() {
this.HashValue = '';
this.build = function() {
var pkt_len = 2 + 16;
var pkt_buf = new BinaryWriter(pkt_len);
pkt_buf.writeShort(0x204);
pkt_buf.writeBinaryString(this.HashValue, 16);
return pkt_buf;
};
};
我们可以发现该数据包正在被实例化here .
pkt = new PACKET.CA.EXE_HASHCHECK();
pkt.HashValue = hash;
Network.sendPacket(pkt);
虽然这是一个仅发送一次的数据包,但想象一下这是一个像 Walk
或 Attack
数据包一样发送数千次的数据包。
我不是编程、oop 或 javascript 方面的专家,但我读过一两本书。
注释:
- 与为浏览器编写的RoBrowser不同,我的服务器将用node.js编写,纯粹的服务器端。
- RoBrowser 是客户端,因此它仅处理来自 1 个服务器的请求。在我的例子中,它将处理所有连接的客户端。
问题:
- 对于服务器架构而言,RoBrowser 处理数据包的方式是否较慢?
- 使用类与不使用类的性能是否存在巨大差异?
I'm looking for references on this topic (packet handling). If you know any, please do tell.
最佳答案
以这种方式定义对象方法将为每个实例化对象创建新函数 - 对于许多对象来说都是不利的:-(
使用原型(prototype)方式,仅在原型(prototype)对象上创建一个方法,该方法由所有实例共享:
// 0x204
PACKET.CA.EXE_HASHCHECK = function PACKET_CA_EXE_HASHCHECK() {
this.HashValue = '';
};
PACKET_CA_EXE_HASHCHECK.prototype.build = function() {
var pkt_len = 2 + 16;
var pkt_buf = new BinaryWriter(pkt_len);
pkt_buf.writeShort(0x204);
pkt_buf.writeBinaryString(this.HashValue, 16);
return pkt_buf;
};
关于javascript - 数千个对象会损害性能吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040420/