Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 为什么nodejs数组移位/推送循环比数组长度87369慢1000倍?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么nodejs数组移位/推送操作的速度在数组大小上不是线性的?在87370处有一个戏剧性的膝盖,完全破坏了系统.

试试这个,首先是q中的87369个元素,然后是87370.(或者,在64位系统上,尝试85983和85984.)对我来说,前者运行时间为.05秒;后者,在80秒内 – 慢1600倍. (在节点v0.10.29的32位debian linux上观察到)

q = [];

// preload the queue with some data
for (i=0; i<87369; i++) q.push({});

// fetch oldest waiTing item and push new item
for (i=0; i<100000; i++) {
    q.shift();
    q.push({});
    if (i%10000 === 0) process.stdout.write(".");
}

64位debian linux v0.10.29从85984开始爬行并以.06 / 56秒运行.节点v0.11.13具有类似的断点,但是具有不同的数组大小.

解决方法

对于数组而言,Shift是一个非常慢的操作,因为您需要移动所有元素,但是当数组内容适合页面(1mb)时,V8能够使用技巧快速执行.

空阵列以4个插槽开始,当您继续推动时,它将使用公式1.5 *(旧长度1)16调整阵列大小.

var j = 4;
while (j < 87369) {
    j = (j + 1) + Math.floor(j / 2) + 16
    console.log(j);
}

打印:

23
51
93
156
251
393
606
926
1406
2126
3206
4826
7256
10901
16368
24569
36870
55322
83000
124517

所以你的数组大小最终实际上是124517项,这使得它太大了.

您实际上可以将阵列预分配到正确的大小,它应该能够再次快速移动:

var q = new Array(87369); // Fits in a page so fast shift is possible

// preload the queue with some data
for (i=0; i<87369; i++) q[i] = {};

如果您需要大于此值,请使用the right data structure

大佬总结

以上是大佬教程为你收集整理的node.js – 为什么nodejs数组移位/推送循环比数组长度87369慢1000倍?全部内容,希望文章能够帮你解决node.js – 为什么nodejs数组移位/推送循环比数组长度87369慢1000倍?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。