为了解决(正则表达式)检测多个条目的问题,从可读性和效率(速度,内存使用)的角度来看,切换/案例方法似乎比if / else方法更好。但是,当检查的病例数增加时,情况仍然如此吗?
在速度和内存使用方面,超过20个案例(以及超过10个中断)的开关/案例句子仍然是最有效的解决方法吗?
示例代码:
for (var i in pieces) { // each pieces[i] is an unknown text
switch (true) {
case /^\"?Accession\"?/.test(pieces[i]):
case /^\"?Protein IDs\"?/.test(pieces[i]):
numeration[0] = i; // an array to store the "column" location
break;
case /^\"?Description\"?/.test(pieces[i]):
case /^\"?Protein names\"?/.test(pieces[i]):
numeration[1] = i;
break;
//etcetcetc...
}
}
答案 0 :(得分:1)
首先,如果你尽可能地将案例组合在一起会更好。
case /^\"?(Protein IDs|Accession)\"?/.test(pieces[i]):
这两者都增加了性能并减少了内存使用量。
switch语句经常被其他编程语言引用为 用于评估多种条件的更好的选择。这个 不是因为switch语句的性质,而是因为 因为编译器如何能够优化switch语句 更快的评估。由于大多数JavaScript引擎都没有这样的 优化,switch语句的性能好坏参半。
Firefox可以很好地处理switch语句,每个条件都是如此 无论如何,评估在大致相同的时间内执行 它们的定义顺序。这意味着有价值的情况 等于0将花费大致相同的执行时间 当值为9.但是,其他浏览器并不是那么好。 Internet Explorer,Opera,Safari和Chrome都显示出来 当您深入到交换机时,执行时间会增加 声明。然而,这些增长小于增长 经历了if语句的每个附加条件。您可以 因此通过订购来改善switch语句的性能 降低频率的条件(与if语句相同) 优化)。
所以我写了一个if语句然后!但等等。
而不是写作:
if (value == 0){
return result0;
} else if (value == 1){
return result1;
} else if (value == 2){
return result2;
} else if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else if (value == 5){
return result5;
} else if (value == 6){
return result6;
} else if (value == 7){
return result7;
} else if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return result10;
}
你可以写这样的东西,所以最糟糕的情况并不像评估9条件那样糟糕:
if (value < 6){
if (value < 3){
if (value == 0){
return result0;
} else if (value == 1){
return result1;
} else {
return result2;
}
} else {
if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else {
return result5;
}
}
} else {
if (value < 8){
if (value == 6){
return result6;
} else {
return result7;
}
} else {
if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return result10;
}
}