【发布时间】:2013-04-25 13:11:32
【问题描述】:
我在 ECMAscript 的常规基础上使用 switch-case 语句。除了我个人对此的认可之外,还有大量的专业文献,关于这种语言的一般性能,特别是关于条件语句。
我记得的一个很好的例子是 Nicholas Zakas 的优秀书籍“High Performance Javascript”。就像在许多其他书籍和文章中一样,当您使用 两个 条件案例时,据说 switch-case 语句总是比 if (else) 语句快。
在我所知道的任何类 C 语言中,switch-case 语句只不过是一个二进制哈希映射,再次分解,它是一个 jmp 代码链 在汇编中。好好读书here
但是,在这个前言之后:
我与我的团队讨论了事件处理函数的用法以及我们将如何处理事件类型。无论我们是否要为任何事件使用显式函数,或者我们是否应该使用一个处理多个事件类型的big函数。在那次讨论中,性能问题得到了发展,我们创建了一个非常基本、简单的 jsPerf:
http://jsperf.com/engine-context-data-caching-test/3
我对结果和所见感到非常震惊。相信这些测试用例,case statements 的 顺序 对执行性能非常重要。 long 和longSlow 之间的区别只是case 'baz' 语句在switch 语句中的位置。这是真实合理的吗?
有没有可能我忽略了什么?首先,我想得很好,可能是 case 语句不够,解释器只会在后台创建 if-else 条件,所以我增加了数量,结果没有任何变化。
我只是拒绝相信像 V8 和 spidermonkey 这样的 ECMAscript 引擎仍然没有优化这个问题。
【问题讨论】:
标签: javascript switch-statement v8 ecmascript-5 spidermonkey