整数比字符串更快作为Javascript中查找表的键吗?

时间:2013-01-17 01:59:18

标签: javascript performance hash lookup-tables

我从后端返回的数据包含很多参考数据,我需要有效地访问它,所以我正在考虑创建(object的id)=> (对象本身)类型查找。对象的ID以字符串形式返回,我想知道整数是否比字符串更快作为哈希键?

playerLookup = {};
for (var i = 0; i < players.length; i++) {
  var player = players[i];
  playerLookup[player.id] = player;
  // vs.
  playerLookup[parseInt(player.id)] = player;
}

根据jsperf test http://jsperf.com/testasdfa,Chrome上的整数查找速度相当快(约25%)。不确定是否正确测试了场景。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

我的观点是找到元素的最快方法是通过模块化哈希表。

使playerLookup成为一个包含n个元素的数组,数组的每个元素都设置为-1(或者某个值让你知道该位尚未设置)。

存储playerId时,请将其存储在playerLookup[parseInt(player.id) % n]

以这种方式从哈希表中查找项目的工作复杂度为1,但上面列出的方法的工作复杂度为x,其中x = playerLookup.length(无论您是使用字符串还是数字作为键)。

要使哈希表更小,请选择较小的n。 n越小,我们就越有可能发生冲突。

冲突

要处理冲突,请将playerLookup的每个元素都设为一个数组。如果你在一个已经包含另一个玩家的地方添加一个playerId给playerLookup,那么将新的一个列在这个旁边(即现在两个都在同一个地方)。如果你查找一个玩家并在散列表中找到一个包含多个玩家的地点,只需遍历这个数组直到找到玩家。此迭代将与您考虑的第一个实现具有相同的工作复杂性,但具有两个优点:

  1. 由于模块化哈希表,它甚至不太可能发生

  2. 当它发生时,我们正在迭代的数组平均比你原来实现的数组小n倍(其中n是我们的模数变量)。

  3. 由于数学原因(使用模数),我建议为n选择素数。