上下文:我正在构建一个读取rss feed并在后台更新/检查feed的小站点。我有一个数组来存储要显示的数据,另一个数组来存储已显示的记录的ID。
问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。
该网站将保持运行和更新状态,并且不太可能经常重启/刷新浏览器。
如果我想考虑从数组中清除一些记录,那么在限制(例如100个项目)后删除某些记录的最佳方法是什么。
上下文:我正在构建一个读取rss feed并在后台更新/检查feed的小站点。我有一个数组来存储要显示的数据,另一个数组来存储已显示的记录的ID。
问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。
该网站将保持运行和更新状态,并且不太可能经常重启/刷新浏览器。
如果我想考虑从数组中清除一些记录,那么在限制(例如100个项目)后删除某些记录的最佳方法是什么。
Answers:
直到“速度变慢”为止的最大长度完全取决于目标计算机和实际代码,因此,您需要在该平台上进行测试,以了解可接受的平台。
但是,由于ToUint32抽象操作,根据ECMA-262第5版规范的数组的最大长度由无符号32位整数限制,因此最长的数组可能具有2 32 -1 = 4,294,967,295 = 42.9亿个元素。
无需修剪数组,只需将其作为循环缓冲区(索引%maxlen)来解决。这将确保它永远不会超过限制(实现循环缓冲区意味着一旦到达末尾,您便会重新回到起始点-不可能超出数组的末尾)。
例如:
var container = new Array ();
var maxlen = 100;
var index = 0;
// 'store' 1538 items (only the last 'maxlen' items are kept)
for (var i=0; i<1538; i++) {
container [index++ % maxlen] = "storing" + i;
}
// get element at index 11 (you want the 11th item in the array)
eleventh = container [(index + 11) % maxlen];
// get element at index 11 (you want the 11th item in the array)
thirtyfifth = container [(index + 35) % maxlen];
// print out all 100 elements that we have left in the array, note
// that it doesn't matter if we address past 100 - circular buffer
// so we'll simply get back to the beginning if we do that.
for (i=0; i<200; i++) {
document.write (container[(index + i) % maxlen] + "<br>\n");
}
您可以尝试执行以下操作来测试和调整长度:
http://jsfiddle.net/orolo/wJDXL/
var longArray = [1, 2, 3, 4, 5, 6, 7, 8];
if (longArray.length >= 6) {
longArray.length = 3;
}
alert(longArray); //1, 2, 3
就像@maerics所说,目标计算机和浏览器将决定性能。
但是对于某些实际数字,请在我的2017年企业版Chromebook上运行以下操作:
console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
x=5e4
耗时16ms,足以应付60fpsx=4e6
需要250毫秒,这很明显,但没什么大不了的x=3e7
花费1300ms,这很糟糕x=4e7
需要11000毫秒并分配额外的2.5GB内存因此,大约3,000万个元素是一个硬上限,因为javascript VM落在4,000万个元素的悬崖上,很可能会使进程崩溃。