【问题标题】:Using object literal rather than switch statement使用对象字面量而不是 switch 语句
【发布时间】:2012-11-03 05:49:38
【问题描述】:

有很多关于 switchif/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


【解决方案1】:

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

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

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

希望有帮助!

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

【讨论】:

  • 感谢@xavier-holt,这是一个清晰、客观和有启发性的答案。
  • 我只想指出,如果语句可以按频率排序,则 Switch 语句是 O(logN)。此外,我相信当键是 int 或 String 时,主要的 Jits 会优化 Switch 语句。
【解决方案2】:

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

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

另外一点,除了 list 的大小之外,需要注意的是,在对象概念中,查找积分不会有任何好处,而 switch 可以优化该位。

【讨论】:

  • 查找“积分”?抱歉,在这种情况下这是什么意思...您的意思是“整数”吗?
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2020-10-02
  • 1970-01-01
  • 2014-08-07
  • 2021-12-09
  • 1970-01-01
  • 2020-06-04
相关资源
最近更新 更多