问题描述
当我想从我的Meteor应用程序迭代存储在MongoDB中的一些文档集时,我可以使用其中任何一个
db.collection.find( ... ).forEach( function f( doc ){ ... })
要么
var docs = db.collection.find( ... ).fetch();
_.each( docs, function f( doc ){ ... }); // using underscore.js
从性能的角度来看哪种方式更可取? 两种选择都有什么缺点和优点?
1楼
这两个语句在核心API级别基本相同,即获取光标并转换结果。 然而,性能有一个“核心”差异:
.forEach()
将“一次一个”转换游标结果并处理它提供的迭代器函数。.fetch()
从光标“all all”获取“数组”,这意味着它在一次命中中全部“在内存中”。
所以无论如何,在从查询的光标获取“核心”操作时,实际上“更快”。
但是,不评估每个游标迭代的“表达式”可能会“稍微快一些”,因此.fetch()
可能在这里赢得“小”。
当然,最重要的是“现在一切都在记忆中”,因此需要考虑“开销”。
同样,在.fetch()
, _.each()
还没有被处理,所以俗话说。
“你在环形交叉路口可能”松动“的摆动中获得了什么” 。
如果没有对特定案例进行全面基准测试,“时间”可能会相似。 除非专门应用您正在使用的数据集的大小,否则通用基准测试几乎无用。
因此,一般情况下, “大致相同” ,但是使用.fetch()
会比从一开始就迭代游标消耗更多的内存 。