7

我在http://www.jquery4u.com/javascript/shorthand-javascript-techniques/上看到了一篇文章,他在其中谈到了使用 switch 语句的另一种方法。

我在下面创建了一个片段,但我不确定为什么替代品慢了 99%。

function doX(){}
function doY(){}
function doN(){}
var something = 1;

var cases = {
    1: doX,
    2: doY,
    3: doN
};
if (cases[something]) {
    cases[something]();
}

http://jsperf.com/alternateswitch

任何想法?

4

4 回答 4

8

“JSON”语法只是一个对象。此外,您的比较在这里有点不公平,因为您每个定时循环都创建一个全新的对象,这有点昂贵。

如果将对象创建移至设置部分,则速度差异变得可以忽略不计:http: //jsperf.com/alternateswitch/4

如果您删除该if语句,该对象会快一点(至少对我而言):http: //jsperf.com/alternateswitch/5。额外的属性查找和真实性检查确实减慢了速度。

于 2013-08-20T16:30:28.443 回答
3
  • 我相信 Javascript 对象是一个关联数组,通常实现为哈希表。每次查找都需要一个键来通过散列函数。散列函数就像一把双刃。对于小数据,它会比 if-elseif-else 慢。但是,对于更大的数据,它会优于普通的 if-elseif-else
  • 您偏爱 是非常不公平的switch,您认为您正在寻找的变量是第一种情况。因此,您的测试的复杂度为switchO(1)。
于 2013-08-20T16:36:27.393 回答
3

作者从未声称更短的代码(只是可能情况的哈希图)实际上会更快。显然,当您在测试套件中运行阵列时,阵列创建会对性能产生负面影响。同时,该switch语句是编译后的代码。

如果您的代码被重用,您将看到一些改进,即您保留 ; 的值cases在这个测试用例中,我测量了大约 20-30% 的差异,具体取决于哪种情况发生得更频繁。

也就是说,除非您的代码在紧密循环中运行,否则像这样的孤立性能测试将没有用,因为测试用例在我的家用计算机上以每秒 50M+ 的操作运行。因此,两者之间的差异应该基于其他因素,例如代码清晰度或switch如果您忘记放置语句很容易弄乱语句的事实break;

于 2013-08-20T16:31:39.093 回答
1

通常switch语句由编译器/解释器优化。它们甚至比链式if-else语句还要快。通过使用JSON对象而不是switch语句,您绕过了 Javascript 引擎优化。

于 2013-08-20T16:36:57.733 回答