繁体   English   中英

如何加快 NodeJS 数组访问?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM