在此测试:http://jsperf.com/test-for-speed-of-various-conditionals
我感兴趣的是其他人是否得到了相同的结果,以及人们可能会想到为什么结果会因浏览器而异(特别是w / Safari)。有趣的是Firefox如何民主地处理各种情况。
请告知我的方法是否存在严重错误:)
Firefox 3.6 / Mac OSX 10.64:
开关= 824,352 Ops / sec(慢14%)
如果/ else = 530,062(44%慢,最慢)
哈希/懒惰= 968,035(最快)
哈希/ if / else = 963,765(0%较慢)
Chrome 6.0.472.63/Mac OSX 10.64:
开关= 10,220,039 Ops / sec(慢62%)
如果/ else = 7,744,284(71%慢,最慢)
哈希/懒惰= 27,130,039(最快)
哈希/ if / else = 25,297,370(6%较慢)
Safari 5.0.2 / Mac OSX 10.64:
开关= 15,044,132 Ops / sec(最快)
如果/ else = 1,793,051(88%慢,最慢)
哈希/懒惰= 10,381,941(30%较慢)
哈希/ if / else = 11,119,576(26%较慢)
Opera 10.10 / Mac OSX 10.64:
开关= 497,238 Ops / sec(32%较慢)
如果/ else = 250,904(66%慢,最慢)
哈希/懒惰= 740,520(最快)
哈希/ if / else = 634,424(14%慢)
MSIE 8.0 / Windows NT:
开关= 176,267 Ops / sec(60%较慢)
如果/ else = 124,783(72%慢,最慢)
哈希/懒惰= 447,421(最快)
哈希/ if / else = 442,736(14%慢)
答案 0 :(得分:2)
Javascript有规范但它没有定义实现;由浏览器供应商来决定如何实现规范(这也导致了大量的跨浏览器问题,尽管最近他们的情况越来越好)。各种浏览器实现您使用的各种方法的方式可能不同。
答案 1 :(得分:0)
这些不是真正公平的测试。直接查找更快的原因是因为每个其他测试也在条件检查之上进行完全相同的查找。并且没有真正的理由来编写像:
这样的代码if (t == 'e') c['e'];
这显然违反了DRY(不要重复自己),并且您不会在查找中使用字符串文字保存任何时间,因为仍然必须获取变量t的内容以进行比较。
另外
if (c[t]) c[t]();
和
一样懒惰c[t] && c[t]();
至于为什么Safari提供了相反的结果,我不知道,因为“操作a +操作b<操作a”是不合逻辑的。应该注意的是,Javascript中的性能测试通常是不可靠的,因为Date对象限制为毫秒,甚至通常不能提供足够的准确性来获得有用的结果。
最后,在其他条件相同的情况下,对象查找永远比if / else或switch语句更快,并且实际上可能要慢几个数量级。 if / else和switch之间的差异如果存在则应该可以忽略不计,当然高度依赖于特定的浏览器/解释器。