Ere*_*evi 8 performance node.js
在阅读了许多类似问题后:
我还有一个问题:假设我有一个很大的字符串数组(几千个),我必须进行多次查找(即多次检查一个给定的字符串是否包含在这个数组中).在Node.js中执行此操作的最有效方法是什么?
A.排序字符串数组,然后使用二进制搜索?要么:
B.将字符串转换为对象的键,然后使用"in"运算符
?
我知道A的复杂度是O(log N),其中N是字符串的数量.
但我不知道B的复杂性.
如果Javascript对象被实现为哈希表,则B的复杂度平均为O(1),这比A好.但是,我不知道Javascript对象是否真的实现为哈希表!
2016年更新
由于您询问的是node.js并且它是2016年,您现在可以使用ES6中的Set或者Map对象,因为这些内置在ES6中.两者都允许您使用任何字符串作为键.Set当您只想查看密钥是否存在时,该对象是合适的:
if (mySet.has(someString)) {
//code here
}
Run Code Online (Sandbox Code Playgroud)
并且,Map当您想要存储该键的值时,如下所示:
if (myMap.has(someString)) {
let val = myMap[someString];
// do something with val here
}
Run Code Online (Sandbox Code Playgroud)
现在,两个ES6功能都内置于node.js中,从节点V4开始(此编辑的当前版本node.js为v6).
查看此性能比较,了解Set操作比其他许多选项快多少.
较旧的答案
所有重要的性能问题都应该通过jsperf.com等工具中的实际性能测试进行测试.在您的情况下,javascript对象使用类似哈希表的实现,因为没有执行得很好的东西,整个实现会很慢,因为很多javascript使用对象.
对象上的字符串键将是我测试的第一件事,并且是我对最佳表演者的猜测.由于对象的内部是用本机代码实现的,我希望这比你自己的哈希表或在javascript中实现的二进制搜索更快.
但是,当我开始回答时,您应该使用jsperf等工具中最关注的字符串的数量和长度来测试您的具体情况.
对于固定的大字符串数组,我建议使用某种形式的基数搜索 另外,看看这个包中的不同数据结构和算法(AVL树、队列/堆等)
我非常确定使用 JS 对象作为字符串存储将导致该对象的“哈希模式”。根据实现的不同,这可能是 O(log n) 到 O(1) 时间。查看一些jsperf基准测试,以比较排序数组上的属性查找与二分搜索。
在实践中,特别是如果我不打算在浏览器中使用代码,我会将此功能卸载到 redis 或 memcached 之类的东西。
| 归档时间: |
|
| 查看次数: |
3738 次 |
| 最近记录: |