当我想从我的Meteor应用程序迭代存储在MongoDB中的一些文档时,我可以使用
db.collection.find( ... ).forEach( function f( doc ){ ... })
或
var docs = db.collection.find( ... ).fetch();
_.each( docs, function f( doc ){ ... }); // using underscore.js
从性能的角度来看,哪种方式更可取?两种选择都有什么缺点和优点?
答案 0 :(得分:3)
这两个语句在核心API级别基本相同,即获取光标并转换结果。然而,性能有一个“核心”差异:
.forEach()
会将游标结果“一次转换一次”并处理它提供的迭代器功能。
.fetch()
从光标“一次性”获取“数组”,这意味着它在一次点击中全部“在内存中”。
所以无论如何,在执行从查询光标中取出的“核心”操作时,实际上“更快”。但是,不评估每个游标迭代的“表达式”可能会“稍微快一些”,因此.fetch()
可能在这里赢得“小”。
当然,最重要的是“现在一切都在记忆中”,因此需要考虑“开销”。同样,在.fetch()
_.each()
时,.fetch()
尚未处理,正如俗话所说。 “你在”环形交叉路口可能“松散”的秋千上“获得了什么”。
如果没有对特定案例进行全面基准测试,“时间”可能会相似。除非专门应用您正在使用的数据集的大小,否则通用基准测试几乎无用。
因此出现了一般情况,“大约相同”,但是使用connection.query('SELECT * FROM allrounds WHERE id = "' + maxId[0].maxId + '"', function (error, results, fields) {
//result:
{
id: 3,
timeStart: 'a',
winner: 76561198034202910, //should be 76561198034202907 why is it +3?
token: 'CsfjHaw6',
status: 0
}
var winner = results[0].winner;
console.log(winner); //-> 76561198034202910
}
将消耗更多内存,而不仅仅是迭代光标。启动。