gpt4 book ai didi

Javascript循环缓冲队列实现为 "FIFO queue"

转载 作者:行者123 更新时间:2023-12-03 05:34:31 25 4
gpt4 key购买 nike

数组有循环缓冲区版本吗?假设一次最大推送元素的数量已知,我是否必须派生自己的 FIFO 队列来提高性能?

这是我尝试过的:

循环实现:

function CBuf(n)
{
var ctrPush=0;
var ctrPop=0;
var ab = new ArrayBuffer(n*4);
var buf = new Uint32Array(ab);

this.push = function (v) {
buf[ctrPush%n] = v;
ctrPush++;
};


this.empty = function () {
return (ctrPush == ctrPop);
}


this.pop = function () {
var tmp = buf[ctrPop%n];
ctrPop++;
return tmp;
};
}

基准简单数组:

{
var t1 = new Date();
var arr = [];

for (var j = 0; j < 1000; j++) {
for (var i = 0; i < 10000; i++) {
arr.push(i);
}
for (var i = 0; i < 10000; i++) {
arr.shift();
}
}
var t2 = new Date();

console.log("array time=" + (t2 - t1));
}

基准循环缓冲区:

{
var t1 = new Date();
var arr = new CBuf(10000);

for (var j = 0; j < 1000; j++) {
for (var i = 0; i < 10000; i++) {
arr.push(i);
}
for (var i = 0; i < 10000; i++) {
if(!arr.empty())
arr.pop();
}
}
var t2 = new Date();

console.log("cbuf time="+(t2 - t1));
}

结果:

array time=2749 ms
cbuf time=552 ms (230 if using &(n-1) instead of %n)

最多 70k 个元素:

array time=19456 ms
cbuf time=3872 ms (1700 if using &(n-1) instead of %n)

它们似乎具有相似的时间复杂度,但 Nodejs 中的数组移位速度较慢。也许它会检查很多事情,例如不断检查边界和调整大小?我需要类似 SIMD 变量但长度为 n 的东西。

我计划在 Nodejs 服务器间工作调度程序队列上使用它。

编辑:

在这里您可以测试:

https://jsperf.com/fifo-array-vs-circular-buffer-preallocated

最佳答案

插入和移动速度很慢。只需使用数组索引即可。

关于Javascript循环缓冲队列实现为 "FIFO queue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40789468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com