数据冗余,用空间换取空间。
最常见的就是,关系型数据库设计,故意加其它table出现过的字段,然后查询某些数据就不用跨表查询,这样查询效率较高,这是优点。
优点之后是缺点,缺点就是,修改数据,要跨表修改。
那么,逻辑冗余呢?
我遇到的情况之一就是,js自身的bug了,就是浮点数运算,偶尔会算着算着,突然冒出个结果是.0000000000之类。
(这个呢,本身就是语言错误,那么我们要不要进入这个语言的源代码,来改写我们的js代码。可以,但代价高。
而且,语言自己也会升级,当发现这是个bug,下个版本大多数情况下会修复。于是你以前写的代码很可能被废弃了。)
于是,在js浮点数计算里面,基本用toFixed(n)来保证你要的精确度,不止一次使用,可能的话,处处使用。
用代码数量换取结果的准确性。cpu对于同个逻辑执行好几次。
因为有时候,对于某段代码的执行结果,你也不敢确定。尤其是修改别人的代码。这时候你就要逻辑冗余。
优点就是,保证运算的结果准确性。
缺点就是,下次修改代码,处处修改。
另一个逻辑冗余的例子:
function bubble_sort(array){
var i,j,temp,array_length = array.length;
for(i=0; i<array_length; i++){//第n次
for(j=0; j<array_length; j++){//筛选出最大值,调换
if(array[i] < array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
var i,j,temp,array_length = array.length;
for(i=0; i<array_length; i++){//第n次
for(j=0; j<array_length; j++){//筛选出最大值,调换
if(array[i] < array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
上述例子,是冒泡排序。
在第二个for循环里面,其实没必要每次都循环array_length次,这样会增加判断次数,从而增加cpu负担。但是结果还是一样。
从性能上说,这不是块好代码。
但从代码的记忆上,和编写上,是块好代码。