[英]How can I speed up NodeJS array access?
我在 NodeJS 中编写了一个解析器,它读取测试设备样本的大文件(600MB),反序列化,然后将每个样本线性拟合到斜率和偏移量表(每个大约 10 个条目),例如基本上这个在一个循环:
raw_value = buffer.readUInt16LE(buf_offset)
range = buffer.readUInt16LE(buff_offset+2)
value = raw_value * slope[range] + offset[range]
编辑:这是代码。 它是专有的,所以我重命名了所有内容并更改了实际的浮点数,但想法是一样的:一个数据包进入 read_packet function 数亿次。 查找是最慢的部分。
const coeff = {
mode_x: {
m: [
0.0011348513653501,
0.0011348513653501,
0.0011348513653501,
0.0011348513653501,
0.0003508001973386
],
b: [
0.0011348513653501,
0.0011348513653501,
0.0011348513653501,
0.0011348513653501,
0.0003508001973386
]
},
mode_y: {
m: [
0.0000150205642057,
0.0007774173864163,
0.0001675113162491,
0.0000014954827065,
0.0001675113162491,
0.0001675113162491,
0,
null
],
b: [
0.0000150205642057,
0.0007774173864163,
0.0001675113162491,
0.0000014954827065,
0.0001675113162491,
0.0001675113162491,
0,
null
]
}
}
function parse_packet (pkt, length) {
let accrete = 0
for (let offset = 0; offset < length; offset += 4) {
sample = pkt.readUInt16LE(offset)
xval = pkt.readUInt8(offset + 2)
yval = pkt.readUInt8(offset + 3)
x = (i_raw + coeff.mode_x.b[xval]) * coeff.mode_x.b[xval]
y = (v_raw + coeff.mode_y.m[yval]) * coeff.mode_y.b[yval]
accrete += x + y
}
return accrete
}
我尝试将 m 和 b arrays 移到他们自己的预分配 arrays 中,例如
mode_xm = new Float32Array(50)
coeff.mode_x.m.forEach((x,i) => { mode_xm[i] = x }
但以上没有任何区别。
如果我只是简单地为斜率和偏移量输入常量,代码会快约 25 倍。
与 C 相比,数组/对象查找如此缓慢,这让我感到非常震惊(是的,我知道我正在将 C 与 JavaScript 进行比较,请承受我的巨大损失)。
那里有更快的数值 arrays 吗? 我找不到 npm 中的任何内容。 看起来像一个带有直接 C 链接的普通浮点数组会很有用。
谢谢, PT
这似乎是一个已知问题,因为 arrays 是对象,索引本质上是 object 代码中的键。
错误的。 包括 V8 在内的所有引擎都不使用“对象”(意思是:键值对列表)来表示 arrays,而是根据您使用数组的方式使用一些专门的数据结构。
如果我只是简单地为斜率和偏移量输入常量,代码会快约 25 倍。
正确的。 常量可以内联。 没有计算比计算更快。
数组/对象查找如此缓慢,这让我感到非常震惊。
有多慢? . 这是一个相当模糊的说法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.