13

关于switchif/else语句中的最佳实践有很多讨论和评论。我看到有人说我们都应该尽可能使用对象字面量而不是 switch

所以我复制了这个案例,并在 switch 之间进行了一些简单的测试:

(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);

运行此测试后,显然 switch 语句比在对象字面量中调用测试值更快。

我的测试错了吗?在这种情况下使用一种或另一种方法之前我应该​​考虑什么?或者也许我看到的关于这个主题的自以为是的评论是错误的,我不应该试图绕过基本面......

4

2 回答 2

23

您可能会看到规模效应:switch 语句是O(n),而哈希表查找(可能用于查找对象文字中的方法)是 (amortized) O(1)。但是 Big-O 度量只能准确地描述性能如何在真正的大输入上扩展。if在您的测试中,五个语句比哈希表查找更快也就不足为奇了。

所以基本上: 你有多少把钥匙? 如果您只有五个键,则每次查找平均会命中 2.5 个键,这比单个哈希表查找要快。但是如果你有 500 个呢?这是平均 250 条if语句 - 仍然与单个哈希查找相比。哈希表(对象文字)方法在这一点上几乎肯定会更好。

但最终的答案是什么?每个人都讨厌听到这个,但这是唯一权威的方法:使用您的实际生产代码进行基准测试。这是一种痛苦,但你肯定知道。

希望有帮助!

PS: 这是抛开编码风格偏好的所有考虑因素,但我真的不想进入那个......

于 2012-11-14T17:29:08.243 回答
2

好吧,我修改了你的代码(在这里),让你看看什么时候对象概念会更好。

正如 Xavier 所描述的,但它不必达到 500 左右。大约有 40 个案例暴露了开关。

另一件事,除了要注意的列表的大小之外,在对象概念中,查找积分将没有任何好处,而 switch 可以优化该位。

于 2012-11-14T17:46:18.557 回答