ECMAscript中的案例性能
我在ECMAscript中定期使用switch-case
语句。 除了我个人对此的认可之外,还有大量的专业文献,关于一般这种语言的表现和关于条件表述的具体内容。
我记得的一个很好的例子就是Nicholas Zakas出色的书“High Performance Javascript”。 就像在其他许多书籍和文章中一样,有人说,当你使用两个以上的条件案例时, switch-case
语句总是比if (else)
语句快。
在我所知的任何类C语言中, switch-case
语句不过是一个二进制哈希映射,它再次分解为汇编中的一系列jmp代码。 在这里有一个很好的阅读
但是,在这个前言之后:
我和我的团队讨论了事件处理函数的用法,以及我们如何处理事件类型。 我们是否要为任何事件使用显式函数,或者如果我们应该使用一个处理多个事件类型的大函数。 在那次讨论中,性能问题得到了发展,我们创建了一个非常简单的jsPerf:
http://jsperf.com/engine-context-data-caching-test/3
我对结果和我所看到的非常震惊。 相信这些测试案例, case statements
的顺序对执行的性能极为重要。 long
和longSlow
之间的区别在那里,只是switch
语句中longSlow
case 'baz'
语句的位置。 这是真实合理的吗?
有没有机会忽略某些东西? 首先,我的想法很好,也许它没有足够的case
陈述,而解释者只会在引擎盖下创建if-else
条件,所以我增加了数量而没有改变结果。
我只是拒绝相信像V8和spidermonkey这样的ECMAscript引擎,仍然没有优化这个问题。
我引用此来源:http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html#sect2
在以下情况下使用if语句:
有不超过两个离散值要测试。
有很多值可以很容易地分成范围。
在以下情况下使用switch语句:
有两个以上但少于10个的离散值要测试。
没有条件范围,因为这些值是非线性的。
使用数组查找时:
有超过10个值要测试。
条件的结果是单一的值,而不是一些要采取的行动。