Javascript ECMAscript中的开关大小写性能
我在ECMAscript中使用常规的Javascript ECMAscript中的开关大小写性能,javascript,switch-statement,v8,ecmascript-5,spidermonkey,Javascript,Switch Statement,V8,Ecmascript 5,Spidermonkey,我在ECMAscript中使用常规的switch case语句。除了我个人对它的认可之外,还有大量的专家文献,关于这门语言的一般表现,特别是关于条件陈述 例如,我记得的一个好例子是Nicholas Zakas的优秀著作《高性能Javascript》。与许多其他书籍和文章一样,当您使用两个以上的条件语句时,switch case语句总是比if(else)语句更快 在我所知道的任何类似C的语言中,switch case语句只不过是一个二进制哈希映射,再次分解,它是汇编中的一个jmp代码链。好好读一读
switch case
语句。除了我个人对它的认可之外,还有大量的专家文献,关于这门语言的一般表现,特别是关于条件陈述
例如,我记得的一个好例子是Nicholas Zakas的优秀著作《高性能Javascript》。与许多其他书籍和文章一样,当您使用两个以上的条件语句时,switch case
语句总是比if(else)
语句更快
在我所知道的任何类似C的语言中,switch case
语句只不过是一个二进制哈希映射,再次分解,它是汇编中的一个jmp代码链。好好读一读
然而,在这一前言之后:
我与我的团队讨论了事件处理函数的使用,以及我们将如何处理事件类型。我们是否要对任何事件使用显式函数,或者是否应该使用一个处理多种事件类型的大函数。在讨论中,我们提出了性能问题,并创建了一个非常基本、简单的jsPerf:
我对结果和我所看到的感到非常震惊。相信这些测试用例,case语句的顺序对执行性能至关重要。这里的long
和longSlow
之间的区别只是case'baz'
语句在switch
语句中的位置。这是真实合理的吗
有没有可能我忽略了什么?首先,我想,也许这还不够case
语句,解释器只会在引擎盖下创建if-else
条件,所以我增加了数量,结果没有任何变化
我只是不相信像V8和spidermonkey这样的ECMAscript引擎仍然没有优化这个问题。我引用了以下来源:
在下列情况下使用if语句:
- 要测试的离散值不超过两个
- 有大量的值可以很容易地划分为多个范围
在下列情况下使用switch语句:
- 要测试的离散值多于两个,但少于10个
- 没有条件的范围,因为这些值是非线性的
在以下情况下使用数组查找:
- 要测试的值超过10个
- 条件的结果是单个值,而不是要采取的多个操作
感谢您的回答,但它根本无法回答问题。你应该重新阅读这个问题,或许可以提供一个深入的答案:)