ECMAscript中的switch-case性能

时间:2013-04-25 13:11:33

标签: javascript switch-statement v8 ecmascript-5 spidermonkey

我在ECMAscript的常规基础上使用switch-case语句。除了我个人对它的认可之外,还有大量的专业文献,关于这种语言的表现以及条件陈述。

我记得的一个很好的例子是Nicholas Zakas的优秀书籍“ High Performance Javascript ”。与许多其他书籍和文章一样,当您使用超过两个条件的情况时,据说switch-case语句总是比if (else)语句更快。

在我所知道的任何 C-like 语言中,switch-case语句只不过是二进制哈希映射,再次分解为链汇编中的jmp代码。好好阅读here

然而,在这个前言之后:

我与我的团队讨论了事件处理函数的用法以及我们如何处理事件类型。我们是否要对任何事件使用显式函数,或者我们是否应该使用一个 big 函数来处理多个事件类型。在该讨论中,性能问题得到了发展,我们创建了一个非常基本的,简单的 jsPerf

http://jsperf.com/engine-context-data-caching-test/3

我对结果和我看到的内容感到非常震惊。相信这些测试用例,case statements order 对执行性能至关重要。 longlongSlow之间的区别仅在于case 'baz'语句中switch语句的位置。这是真实合理的吗?

我有没有机会忽略某些事情?首先,我想,也许它的case语句不够,解释器只会创建if-else条件,所以我增加了数字而没有任何结果变化。

我只是拒绝相信像 V8 spidermonkey 这样的ECMAscript引擎仍然没有优化此问题。

1 个答案:

答案 0 :(得分:4)

我正在引用此来源:http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html#sect2

在以下时间使用if语句:

  • 要测试的离散值不超过两个。

  • 有大量值可以轻松分成范围。

在以下情况下使用switch语句:

  • 要测试的离散值超过两个但少于10个。

  • 条件没有范围,因为这些值是非线性的。

在以下情况下使用数组查找:

  • 要测试的值超过10个。

  • 条件的结果是单个值,而不是要采取的一些操作。