性能 - 您更喜欢什么选项?

时间:2018-06-18 17:33:18

标签: javascript arrays switch-statement

在我的小项目中,我提出了两个选项:交换机如何工作:

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]}
}

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

3 个答案:

答案 0 :(得分:2)

由于您 _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];

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

答案 1 :(得分:0)

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

如果您仍然关注性能而不是在这种情况下开关速度更快,因为循环会多次检查结束条件,而开关只会检查一次。这称为loop unrolling,优化编译器主要在自己的

上进行

答案 2 :(得分:0)

你得到一些亲密的选票,因为你问“你更喜欢哪一个?”我认为你的问题足够有效,但你应该将其称为“这些选项的优缺点是什么?”

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

var wert = [/* stuff */];
var kurz = [/* stuff */];

kto = kurz[wert.indexOf(__toler)] || kurz[0];

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

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

对此的缺点是,如果您不熟悉该模式,理解它可能有点棘手。

开关模式更容易阅读,并且显而易见。这可能是很多代码,并且有很多冗余(kto=)。

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