切换与对象查找性能(因为 jsperf 已关闭)

IMT*_*Man 12 javascript performance

在我看来,在某些情况下,如果某个值等于某个值,有两种方法可以做某事:开关或对象查找。

使用开关:

var value = ["Hello", "hi", "bYe", "die"][Math.floor(Math.random() * (4))];

switch (value.toLowerCase()) {
  case "hello":
    alert(value + "\n\n" + "hi");
    break;
  case "hi":
    alert(value + "\n\n" + "hello");
    break;
  case "bye":
    alert(value + "\n\n" + "no");
    break;
  case "die":
    alert(value + "\n\n" + "you shot me");
    break;
}
Run Code Online (Sandbox Code Playgroud)

使用对象查找:

var value = ["Hello", "hi", "bYe", "die"][Math.floor(Math.random() * (4))];

var LOOKUP = {
  "hello": function(v) {
    alert(v + "\n\n" + "hi");
  },
  "hi": function(v) {
    alert(v + "\n\n" + "hello");
  },
  "bye": function(v) {
    alert(v + "\n\n" + "no");
  },
  "die": function(v) {
    alert(v + "\n\n" + "you shot me");
  },
};

LOOKUP[value.toLowerCase()](value);
Run Code Online (Sandbox Code Playgroud)

我想知道哪个会有更好的性能?

两种方法都会有任何不明显的问题/陷阱吗?

小智 13

原始答案:查找表要快得多。

2020 年更新答案:这两种方法在现代浏览器中的性能几乎相同,switch 语句比查找表快 20-30%。

不久前我也有同样的问题。如果 jsperf 能够复活,这就是链接。 https://jsperf.com/if-switch-lookup-table/10

编辑:工作基准https://jsben.ch/JYZLQ

  • 好吧,这个测试每次都是_recreating_对象。显然更慢。在现实世界的场景中,您将定义一个常量对象一次,然后仅在查找时重复。我创建了另一个测试,其中还包括 `Map` http://jsben.ch/HoDxa **TL;DR** 对象在 Firefox 上实际上更快,但结果在 Chrome 上保持不变 (3认同)
  • 这是另一个测试:https://jsben.ch/FLez6。使用@Phugo's 作为基础。摆脱了一堆扭曲比较的东西(主要是函数调用)。还加入了“函数内部切换”测试,以防有一些我不知道的编译器自动优化。尽管 switch 版本似乎稍快一些,但这四种方法似乎效果差不多。我认为这可以归结为代码中看起来最好的内容。 (2认同)