javascript散列/数组混合性能
javascript hash/array hybrid performance
对于我的应用程序,我需要一个可以按键进行快速迭代和快速查找的集合。
示例数据
var data = [
{ myId: 4324, val: "foo"},
{ myId: 6280, val: "bar"},
{ myId: 7569, val: "baz"},
... x 100,000
];
密钥包含在我要存储的对象中。我一起黑了Harray(哈希数组)https://gist.github.com/3451147.
以下是的使用方法
// initialize with the key property name
var coll = new Harray("myId");
// populate with data
data.forEach(function(item){ coll.add(item); });
// key lookup
coll.h[4324] // => { myId: 4324, val: "foo"}
// array functionality
coll[1] // => { myId: 6280, val: "bar"}
coll.map(function(item){ return item.val; }); // => ["foo", "bar", "baz"]
coll.length // => 3
// remove value
coll.remove(coll[0]); // delete => { myId: 4324, val: "foo"}
// by key
coll.removeKey(7569) // delete => { myId: 7569, val: "baz"}
// by index
coll.removeAt(0); // delete => { myId: 6280, val: "bar"}
移除速度似乎是我能看到的唯一折衷。存储的对象在h
、Object
和Array
之间共享,所以我不存储任何内容的2个副本。
问题
- 我应该坚持使用
for in
来遍历对象属性吗 - 是否保留对象的键数组,而不是对象本身
- 其他选择
注意:浏览器兼容性不是一个因素。这是铬专用的。
为了知道特定集合是否有用,您必须:
-
首先验证是否存在性能问题。如果它足够快,不要担心。要检查这一点,假设整个页面都很慢,请使用类似Chrome探查器的探查器来检查问题是否在您当前使用的集合中
-
然后检查你正在构建的备用集合是否真的更快。要做到这一点,一个常见的解决方案是使用像http://jsperf.com/(或者简单地通过构建自己的定时测试)。
只有在那之后,你才应该努力确保你的解决方案是API完整的,完全没有bug,(使用测试单元)等等
做我第一次提到的两项检查可能会防止无用的工作,因为V8引擎中的标准对象速度惊人且智能。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- Dojo不解析自定义小部件的模板html中的小部件声明性
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 使用正则表达式评估电子邮件地址时出现性能问题
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 对API数据使用声明性绑定
- 在javascript中搜索项目列表的性能
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- JavaScript数组优化以提高性能
- React+Redux性能优化与组件ShouldUpdate
- 在循环中附加事件处理程序时出现浏览器性能问题
- javascript散列/数组混合性能
- Knockout.js性能-有多少可观察性
- 可见性:隐藏和显示:无之间的性能差异
- 使用类与 ids 用于多个 li 元素示例 20,具有 KNOCKOUT 和 jQuery,性能和可保留性更好
- 混合javascript和php时的性能和缓存
- 浏览器性能显示/可见性