【问题标题】:Performance - What option do you prefer?性能 - 您更喜欢哪个选项?
【发布时间】:2018-06-18 17:33:18
【问题描述】:

在我的小项目中,我做了两个选择,开关的工作方式如下:

switch (_toler) {
    case '20': var kto='M'; break;      
    case '10': kto='k / K'; break;      
    case '5': kto='J'; break;       
    case '2': kto='G'; break;       
    case '1': kto='F'; break;
    case '0.5': kto='D'; break;
    case '0.25': kto='C'; break;
    case '0.1': kto='B'; break;     
    case '0': default: kto='/'; break;
}

和:

var wert=["20","10","5","2","1","0.5","0.25","0.1","0"];
var kurz=["M","k / K","J","G","F","D","C","B","/"];
for (i=0; i<9; i++) {
    if (_toler==wert[i]) {kto=kurz[i]}
}

你更喜欢哪一个?我不知道哪个更好,因为第二个选项是更少的代码。

【问题讨论】:

    标签: javascript arrays switch-statement


    【解决方案1】:

    由于您将 映射 _toler 值到 kto 值,请使用映射 - 在 JS 中它是一个对象。

    var map = {
        '20': 'M',
        '10': 'k / K',
        '5' : 'J',
        '2' : 'G',
        '1' : 'F',
        '0.5' : 'D',
        '0.25' : 'C',
        '0.1' : 'B',
        '0' : '/'
    };
    kto = map[_toler];
    

    这不仅是迄今为止性能方面的最佳选择(因为它被简化为简单的属性查找),而且如果您需要更改、添加或删除映射,它也更容易阅读和维护。

    【讨论】:

      【解决方案2】:

      鉴于少数情况,任何性能差异都可以忽略不计,因此从代码可读性的角度来看,for 循环会更好。

      如果您仍然关心性能,那么在这种情况下,开关会更快,因为循环会检查结束条件多次,而开关 - 只检查一次。这称为loop unrolling,优化编译器在很大程度上是自己完成的

      【讨论】:

        【解决方案3】:

        您获得了一些接近的选票,因为您问“您更喜欢哪一个?”我认为您的问题足够有效,但您应该将其表述为“这些选项的优缺点是什么?”

        您实际上还有另一个选项,甚至不在您的列表中:

        var wert = [/* stuff */];
        var kurz = [/* stuff */];
        
        kto = kurz[wert.indexOf(__toler)] || kurz[0];
        

        这段代码的作用是获取indexOf()__toler,它要么是索引,要么是-1。如果它是-1,那么kurz[-1] 将是undefined,然后将回退到您的kurz[0] 默认情况。这是最紧凑的。这种方法完全优于您的循环版本(尽管它的 Big-O 仍然大致相同)。

        这样做的好处是它可以更轻松地拥有非常大的列表,并且让您可以在运行时轻松地对其进行修改。

        这样做的缺点是,如果您不熟悉该模式,可能会有点难以理解。

        switch 模式更易于阅读,并且它的作用显而易见。缺点是它可能有很多代码并且有很多冗余 (kto=)。

        一般来说,当你只是对值做同样的事情时,第一个会更可取。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 1970-01-01
          • 2010-09-10
          • 2013-04-22
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 2011-07-22
          • 1970-01-01
          相关资源
          最近更新 更多