for(x=0;x<8;x++){
if(x==0||x==8){
y=1;
}
if(x==1||x==7){
y=2;
}
if(x==2||x==6){
y=4;
}
else{
y=6;
}
for(y;y<6;y++)
{
//...
}
}
1
xylophone21 2015-03-20 10:58:07 +08:00
"优化"的目的是什么?
代码好看还是性能? 前者可以查表,后者忘了吧. |
2
Magic347 2015-03-20 11:19:36 +08:00 4
方案一:预置一个类似映射关系的数组,计算过程直接读取
int Y[8] = {1, 2, 4, 6, 6, 6, 4, 2, 1} for (int x = 0; x < 8; x++) { int y = Y[x]; } 方案二:尝试建立动态的映射关系,计算过程中动态执行计算 int Y(int x) { if (0 <= (x%8) && (x%8) <= 2) { return power(2, x%8); } return 6; } for (int x = 0; x < 8; x++) { int y = Y(x); } 以上,就是简单的两种思路吧, 方案一基于空间换时间的思想, 可以节省相应的映射计算开销,保证较好的查询效率; 方案二基于时间换空间的思想, 如果可以找到比较高效的映射函数, 一方面不会浪费存储资源,另一方面也可以实现较好的执行效率 |
3
c742435 2015-03-20 11:25:15 +08:00
另外,如果使用switch-case 而不是连续的if,编译器会帮你创建楼上方案1的那种优化方式。
|
5
zhicheng 2015-03-20 11:42:25 +08:00
switch-case 大法好。C 语言里边最高级的表达式。
for (x = 0; x < 8; x++) { switch (x) { case 0: case 8: y = 1; break; case 1: case 7: y = 2; break; case 2: case 6: y = 4; break; default: y = 6; break; } for (; y < 6; y++) { } } |
7
drivedreams 2015-03-20 12:27:29 +08:00
很显然要用switch
|
8
haitongz 2015-03-20 12:37:23 +08:00
switch吧
|
9
luw2007 2015-03-20 13:30:37 +08:00
数组: [0, 1, 2, 3, 4, 5, 6, 7, 8]
1.=> [0, 1, 2, 3, 4, 3, 2, 1, 0] <= 按照下标5做镜像. f(y) = 4-|x-4|, 得到 2.=> [1, 2, 4, 8, 16, 8, 4, 2, 1] <= 按照需求做指数曲线 f(y) = 2 ** x 判断小于6 其实就是判断第一步中元素小于3. 由 f(y) < 3 得 4-|x-4| < 3, 进而得到 x> 5, 或者x<3 成立. 综上可得: if (x<3 || x>5){ // 分开写可以简化绝对值 y = 2 ** (4-|x-4|) }else{ y = 6 } 使用switch也可以. |
11
otakustay 2015-03-20 15:04:01 +08:00
我来给你们展示下不可读的优化:
function for1() {} function for2() {} function for3() {} var tasks = [for1, for2, for3, for3, for2, for1]; for (var i = 0; i < 8; i++) { tasks[i](); } |
12
Magic347 2015-03-20 16:59:10 +08:00
|
13
Magic347 2015-03-20 17:08:31 +08:00
@xxxpara 另外数组应该至少有9个元素,外部x迭代值的边界条件也需要更正一下,再次更正一下两个方案 :)
方案一: int Y[9] = {1, 2, 4, 6, 6, 6, 4, 2, 1} for (int x = 0; x < 9; x++) { int y = Y[x]; // do something else } 方案二: int Y(int x) { if (6 <= x && x <= 8) { x = 8 - x; } if (0 <= x && x <= 2) { return power(2, x); } return 6; } for (int x = 0; x < 9; x++) { int y = Y(x); // do something else } |
14
br00k 2015-03-20 17:19:03 +08:00
这种自然建议switch,代码可读性也高很多。
|
15
libook 2015-03-21 18:03:58 +08:00
我第一眼也是想到了switch。
其实你要说明优化的方向,是可读性还是存储还是计算? 其实用javascript这么高级的语言,个人的观点是可读性比性能重要,所以优化主要是在可读性上优化,你的代码用switch就会有很好的可读性,容易维护。 |