2013-04-25 68 views
7

我在ECMAscript中经常使用switch-case语句。除了我个人对此的认可之外,还有大量的专业文献,关于这种语言的一般表现以及大约有条件的陈述。ECMAscript中的开关柜性能

我记得的一个很好的例子是由Nicholas Zakas撰写的优秀书籍“高性能Javascript”。与许多其他书籍和文章一样,据说当您使用多于两个条件案例时,switch-case声明始终比if (else)声明快。

在任何类似C语言我所知道的,一个switch-case声明只不过是一个二进制哈希地图,再次细分一样,是JMP代码组装链条。有一个良好的阅读here

然而,这篇序言之后:

我有一个关于事件处理函数与我的团队以及我们如何去处理事件类型的使用的讨论。我们是否要为任何事件使用明确的函数,或者如果我们应该使用一个函数可以处理多个事件类型。在这种讨论中,性能问题的发展可以说创造了一个非常基本的,简单jsPerf

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

我当时非常震惊一下,结果和我所看到的。相信这些测试案例,订单case statements对于执行的性能非常重要。 longlongSlow之间的区别仅在于switch语句中case 'baz'语句的位置。这是真实合理的吗?

有没有机会忽略某些东西?首先,我觉得很好,也许它没有足够的case声明和解释器将只创建if-else条件下,所以我增加了数量,没有任何结果变化。

我只是不相信的ECMAScript引擎,如V8的SpiderMonkey,还是不要优化这个问题。

回答

4

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

使用if语句时:

  • 有不超过两个针对测试离散值。

  • 有大量的值可以很容易地分成范围。

    • 有超过两个,而是要为其测试少于10个离散值:

    时使用switch语句。

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

使用阵列查找时:

  • 存在用于要测试超过10倍的值。

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

+3

你的答案是赞赏,但它根本不回答这个问题。你应该重新阅读这个问题,或者提供一个深入的答案:) – 2013-04-25 13:57:34