JavaScript 对象 vs minimongo 效率
JavaScript Object vs minimongo efficiency
我的Meteor 客户端从服务器接收数据并存储在minimongo 中。此数据保证在他们的会话期间不会更改,因此我不需要 Meteor 的反应性。静态数据恰好通过该路由到达;让我们把它当作给定的。
数据如下所示:
{_id: 'abc...', val: {...}}
在客户端上,我使用以下方法查找值是否更有效:
val_I_need = Collection.findOne({id})
或创建一个 JavaScript 对象:
data = {}
Collection.find().fetch().map((x) => {data[x._id] = x.val})
并将其用于查找:
val_I_need = data[id]
是否存在一个临界点,无论是在数据大小还是查找次数方面,更有效的方法发生变化,或者超过构建对象的初始成本?
FindOne
在较大的数据集上可能更有效,因为它使用游标查找,其中 _id
是索引键,而您的 find().fetch()
方法需要获取所有文档,然后手动迭代通过映射。
请注意,findOne 也可以替换为 .find({_id:desiredId}).fetch()[0]
(假设它 returns 所需的文档)。
mongo documentation on query performance 中有更多相关信息。
但是,如果它只涉及一个后来没有被反应跟踪的对象,我宁愿通过服务器的 "findOne"-返回方法加载它:
export const getOne = new ValidatedMethod({
name: "getOne",
validate(query) {
// validate query schema
// ...
},
run(query) {
// CHECK PERMISSIONS
// ...
return MyCollection.findOne(query);
});
这避免了在当前客户端模板上使用发布/订阅,从而避免使用此集合的 minimongo。想一想 pub/sub 已经初始化了一些反应性来观察集合,因此在某处消耗了一些计算量。
我的直觉是,你永远不会达到将它放在对象中的性能增益产生显着差异的地步。
您的瓶颈更有可能出现在pub/sub机制中,因为将所有文档发送给客户端可能需要一段时间。
通过使用 Meteor 方法检索数据,您会发现大型数据集的差异更为明显。
此时你已经在一个普通的旧 javascript 对象中得到了它,因此最终也会获得本机对象查找的小性能提升。
我的Meteor 客户端从服务器接收数据并存储在minimongo 中。此数据保证在他们的会话期间不会更改,因此我不需要 Meteor 的反应性。静态数据恰好通过该路由到达;让我们把它当作给定的。
数据如下所示:
{_id: 'abc...', val: {...}}
在客户端上,我使用以下方法查找值是否更有效:
val_I_need = Collection.findOne({id})
或创建一个 JavaScript 对象:
data = {}
Collection.find().fetch().map((x) => {data[x._id] = x.val})
并将其用于查找:
val_I_need = data[id]
是否存在一个临界点,无论是在数据大小还是查找次数方面,更有效的方法发生变化,或者超过构建对象的初始成本?
FindOne
在较大的数据集上可能更有效,因为它使用游标查找,其中 _id
是索引键,而您的 find().fetch()
方法需要获取所有文档,然后手动迭代通过映射。
请注意,findOne 也可以替换为 .find({_id:desiredId}).fetch()[0]
(假设它 returns 所需的文档)。
mongo documentation on query performance 中有更多相关信息。
但是,如果它只涉及一个后来没有被反应跟踪的对象,我宁愿通过服务器的 "findOne"-返回方法加载它:
export const getOne = new ValidatedMethod({
name: "getOne",
validate(query) {
// validate query schema
// ...
},
run(query) {
// CHECK PERMISSIONS
// ...
return MyCollection.findOne(query);
});
这避免了在当前客户端模板上使用发布/订阅,从而避免使用此集合的 minimongo。想一想 pub/sub 已经初始化了一些反应性来观察集合,因此在某处消耗了一些计算量。
我的直觉是,你永远不会达到将它放在对象中的性能增益产生显着差异的地步。
您的瓶颈更有可能出现在pub/sub机制中,因为将所有文档发送给客户端可能需要一段时间。
通过使用 Meteor 方法检索数据,您会发现大型数据集的差异更为明显。
此时你已经在一个普通的旧 javascript 对象中得到了它,因此最终也会获得本机对象查找的小性能提升。