fanpei91 / torsniff

torsniff - a sniffer that sniffs torrents from BitTorrent network

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

某些集合可以改成Linked List

fanpei91 opened this issue · comments

某些集合, 全是 append, remove 动作, 这可以改成 Linked List 数据结构, 这样算法复杂度就是O(1)了.

缺点: 空间换时间, 所以内存占用会更高.

这个需要讨论讨论.

内存都白菜价了,可以用链表

内存是白菜价了, 但 V8 对内存限制是很严格的(默认情况下), 要是nodesMaxSizemaxConnections 被设置得很大, 分分钟耗光默认分配的内存量, 然后导致崩溃.

我看这个不用搞了, 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 的好读一点. :)