Javascript循环缓冲区队列实现为“FIFO队列”

时间:2016-11-24 14:57:09

标签: javascript node.js queue v8 fifo

是否有循环缓冲版本的数组?假设当时已知最大推送元素的数量,我是否必须派生自己的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

1 个答案:

答案 0 :(得分:1)

推动和换档很慢。只需使用数组索引。