【发布时间】:2012-11-03 05:49:38
【问题描述】:
有很多关于 switch 和 if/else 语句中最佳实践的讨论和 cmet。我看到有人说我们都应该在可能的情况下使用对象字面量而不是开关。
所以我在开关之间复制了这个案例和I went trough a little and simple test:
(function(test){
var bar;
switch(bar) {
case 1:
bar = 'red';
break;
case 2:
bar = 'blue';
break;
case 3:
bar = 'yellow';
break;
case 4:
bar = 'green';
break;
case 5:
bar = 'black';
break;
}
return bar;
})(5);
并通过对象字面量传递:
(function(test){
return { 1: 'red', 2: 'blue', 3: 'yellow', 4: 'green', 5: 'black' }[ test ];
})(5);
运行test 后,显然 switch 语句比在对象字面量中调用测试值更快。
我的测试错了吗?在这种情况下使用一种或另一种方法之前我应该考虑什么?或者也许我看到的关于这个主题的固执己见是错误的,我不应该试图绕过基本面......
【问题讨论】:
-
你的测试很好;您正在用内存换取速度(您几乎总是可以这样做)。您可能还从事过早/微优化。此外,对于一个对象,您不能运行任意代码(除非这些值是您随后调用的函数,在函数调用的开销下)。一般来说,首先要努力优化您的算法,而不是您的个别代码调用。
-
哦,等等,您的测试有一个问题:您在每次新函数调用期间重新实例化对象字面量。预先分配该对象并重试。另外,请注意,现代 JIT JS 运行时会大量测试类似这样的小代码循环,这将导致指令重写,这可能并不代表真实世界的性能。
-
@Phrogz jsperf.com/switch-from-switches/4;虽然我仍然不喜欢使用对象表示法。
-
我还想说,这肯定只是微优化。目标并不是真正优化我的 switch 语句,它只是碰到人们说:为什么这样做更好?是表演吗?或者它只是冗长的非主流编码风格......如果有一个真正的差异,尽可能小,我可以改变我编码javascript的旧习惯。最后,这不是问题,只是一些好奇心带来的细节。
-
swtich 的更多替代品,具有更好的测试集。 jsperf.com/switch-from-switches/13
标签: javascript loops if-statement switch-statement