某些集合可以改成Linked List
fanpei91 opened this issue · comments
某些集合, 全是 append
, remove
动作, 这可以改成 Linked List
数据结构, 这样算法复杂度就是O(1)
了.
缺点: 空间换时间, 所以内存占用会更高.
这个需要讨论讨论.
内存都白菜价了,可以用链表
内存是白菜价了, 但 V8 对内存限制是很严格的(默认情况下), 要是nodesMaxSize
和 maxConnections
被设置得很大, 分分钟耗光默认分配的内存量, 然后导致崩溃.
我看这个不用搞了, p2pspider CPU 占用率还是蛮低的.
实际测试了一下:
1M的数字,array对比linkedlist,内存:51MB : 100MB,添加时间74ms : 135ms,删除时间:NA : 36ms。(NA是因为跑了几分钟,CPU一直是100%,就给停了,所以这个数量级的array已经不能用了,当然,也可能有参数可以调优)。
降低数量到100K的数字,内存:22MB : 26MB,添加时间:11ms : 9ms,删除时间:41ms : 32ms。
就这个应用来说,内存的损耗和性能的提升都是极小的,喜欢用哪个就用了哪个,你高兴就好。
下边是程序:
var max = 100000;
var array = [];
var start = new Date().getTime();
for(var i = 0; i < max; i++) {
array.push(i);
}
var addEnd = new Date().getTime();
console.log(process.memoryUsage());
console.log("Add used:" + (addEnd - start));
for(var i = 0; i < max; i++) {
array.shift();
}
console.log("Remove used:" + (new Date().getTime() - addEnd));
var LinkedList = require('linkedlist');
var list = new LinkedList();
var max = 100000;
var start = new Date().getTime();
for(var i = 0; i < max; i++) {
list.push(i);
}
var addEnd = new Date().getTime();
console.log(process.memoryUsage());
console.log("Add used:" + (addEnd - start));
for(var i = 0; i < max; i++) {
list.shift();
}
console.log("Remove used:" + (new Date().getTime() - addEnd));
你好认真! 我咋没想到用这个来测试测试呢.
看样子对 p2pspider 来说, LinkedList 没什么显著的提升. 从代码上来说, 还是 Array 的好读一点. :)