哪个更快? Select 按 ID,还是 Select 按索引?

Which is Faster? Select by ID, or Select by Index?

Backbone 通过 ID(分配给每个模型的唯一标识符属性)和索引为集合中的 select 模型提供选项。 访问集合中项目的最快方法是什么?

打开 Backbone.js,我可以看到 collection.get(id)(select-by-ID 函数)使用简单的对象字面量查找和 collection.at(index) (select-by-index 函数)使用简单的数组查找。

来自 Backbone.js:

collection.get(id):

// Get a model from the set by id.
get: function(obj) {
    if (obj == null) return void 0;
    return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid];
}

collection.at(索引):

// Get the model at the given index.
at: function(index) {
    return this.models[index];
}

因此,这个问题的答案应该直接与哪个更快相关——数组访问或对象文字访问(在这种情况下,假设 .get 在它的第一次迭代中使用,它被发送到那里一个 ID,而不是带有 ID 或 CID 的模型)。

根据this JSPerf,按索引(使用collection.at(index))select通常比按ID(使用collection.get(id))select更快但不同浏览器的差异很大。在 Chrome 和我测试的至少一个 Firefox 版本上,差异可以忽略不计,但仍然系统地支持 select by index;然而,在 IE11 中,select 按索引始终(并且几乎完全)两倍 一样快。

这里故事的寓意是尽可能按索引使用 select;散列对象检索 快速方便,但缺乏索引查找的原始效率。

要从散列访问对象,Javascript 引擎必须经过一个额外的查找步骤,这 in addition the overall complexity of objects 使它们成为任何需要性能的脚本的不太理想的选择考虑。