太多的 if else 语句,如果 "index" 变量逻辑每次循环递增 1,是否可以优化它?
Too many if else statements, can it be optimized given the "index" variable logic is incrementing by 1 every loop?
在我的嵌入式系统中,
当系统 运行ning 时,以下 C 代码将通过一个永远的 while 循环在 main 中调用。
有没有更好的方法来优化下面的C代码,使其没有
遍历所有 if else 语句。我在想有没有更好的方法
使代码 运行 更快,因为“index”在每个循环中递增 1。“index”
从 0 开始,递增到 7,然后重置回 0。它处于
重复模式。
优化的原因是下面的代码需要运行每
几微秒。
示例代码如下:
注意有些值是虚构的。
void main(1)
{
static int index = 0;
while (1) {
if (index == 0) {
valueA = 0.88;
valueB = 0.88;
PID.A0 = 0.0012 * 15;
PID.A1 = -0.001 * 15;
index++;
}
else if (index == 1) {
valueA = 0.87;
valueB = 0.87;
PID.A0 = 0.0012 * 8;
PID.A1 = -0.001 * 8;
index++;
}
else if (index == 2) {
valueA = 0.86;
valueB = 0.86;
PID.A0 = 0.0012 * 6;
PID.A1 = -0.001 * 6;
index++;
}
else if (index == 3) {
valueA = 0.83;
valueB = 0.83;
PID.A0 = 0.0012 * 5;
PID.A1 = -0.001 * 5;
index++;
}
else if (index == 4) {
valueA = 0.79;
valueB = 0.79;
PID.A0 = 0.0012 * 3;
PID.A1 = -0.001 * 3;
index++;
}
else if (index == 5) {
valueA = 0.73;
valueB = 0.73;
PID.A0 = 0.0012 * 2;
PID.A1 = -0.001 * 2;
index++;
}
else if (index == 6) {
valueA = 0.71;
valueB = 0.71;
PID.A0 = 0.0012 * 1;
PID.A1 = -0.001 * 1;
index++;
}
else if (index == 7) {
valueA = 0.68;
valueB = 0.68;
index = 0;
}
} // end of while()
}
您可以通过查找来简化逻辑 table:
void main(1)
{
static int index = 0;
struct {
double valueA;
double valueB;
double PID_A0;
double PID_A1;
} values[] = {
{ 0.88, 0.88, 0.0012 * 15, -0.001 * 15 },
...
{ 0.68, 0.68, 0, 0 }
};
while (1) {
valueA = values[index].valueA;
valueB = values[index].valueB;
if (index != 7) {
PID.A0 = values[index].PID_A0;
PID.A1 = values[index].PID_A1;
index++;
} else {
index = 0;
}
}
}
我的第一个倾向是查找 table,如 @dbush 的回答中所述,但您也可以选择手动展开循环,从而完全消除条件 和 index
变量:
while (1) {
valueA = 0.88;
valueB = 0.88;
PID.A0 = 0.0012 * 15;
PID.A1 = -0.001 * 15;
valueA = 0.87;
valueB = 0.87;
PID.A0 = 0.0012 * 8;
PID.A1 = -0.001 * 8;
valueA = 0.86;
valueB = 0.86;
PID.A0 = 0.0012 * 6;
PID.A1 = -0.001 * 6;
valueA = 0.83;
valueB = 0.83;
PID.A0 = 0.0012 * 5;
PID.A1 = -0.001 * 5;
valueA = 0.79;
valueB = 0.79;
PID.A0 = 0.0012 * 3;
PID.A1 = -0.001 * 3;
valueA = 0.73;
valueB = 0.73;
PID.A0 = 0.0012 * 2;
PID.A1 = -0.001 * 2;
valueA = 0.71;
valueB = 0.71;
PID.A0 = 0.0012 * 1;
PID.A1 = -0.001 * 1;
valueA = 0.68;
valueB = 0.68;
} // end of while()
在我的嵌入式系统中, 当系统 运行ning 时,以下 C 代码将通过一个永远的 while 循环在 main 中调用。 有没有更好的方法来优化下面的C代码,使其没有 遍历所有 if else 语句。我在想有没有更好的方法 使代码 运行 更快,因为“index”在每个循环中递增 1。“index” 从 0 开始,递增到 7,然后重置回 0。它处于 重复模式。
优化的原因是下面的代码需要运行每 几微秒。
示例代码如下: 注意有些值是虚构的。
void main(1)
{
static int index = 0;
while (1) {
if (index == 0) {
valueA = 0.88;
valueB = 0.88;
PID.A0 = 0.0012 * 15;
PID.A1 = -0.001 * 15;
index++;
}
else if (index == 1) {
valueA = 0.87;
valueB = 0.87;
PID.A0 = 0.0012 * 8;
PID.A1 = -0.001 * 8;
index++;
}
else if (index == 2) {
valueA = 0.86;
valueB = 0.86;
PID.A0 = 0.0012 * 6;
PID.A1 = -0.001 * 6;
index++;
}
else if (index == 3) {
valueA = 0.83;
valueB = 0.83;
PID.A0 = 0.0012 * 5;
PID.A1 = -0.001 * 5;
index++;
}
else if (index == 4) {
valueA = 0.79;
valueB = 0.79;
PID.A0 = 0.0012 * 3;
PID.A1 = -0.001 * 3;
index++;
}
else if (index == 5) {
valueA = 0.73;
valueB = 0.73;
PID.A0 = 0.0012 * 2;
PID.A1 = -0.001 * 2;
index++;
}
else if (index == 6) {
valueA = 0.71;
valueB = 0.71;
PID.A0 = 0.0012 * 1;
PID.A1 = -0.001 * 1;
index++;
}
else if (index == 7) {
valueA = 0.68;
valueB = 0.68;
index = 0;
}
} // end of while()
}
您可以通过查找来简化逻辑 table:
void main(1)
{
static int index = 0;
struct {
double valueA;
double valueB;
double PID_A0;
double PID_A1;
} values[] = {
{ 0.88, 0.88, 0.0012 * 15, -0.001 * 15 },
...
{ 0.68, 0.68, 0, 0 }
};
while (1) {
valueA = values[index].valueA;
valueB = values[index].valueB;
if (index != 7) {
PID.A0 = values[index].PID_A0;
PID.A1 = values[index].PID_A1;
index++;
} else {
index = 0;
}
}
}
我的第一个倾向是查找 table,如 @dbush 的回答中所述,但您也可以选择手动展开循环,从而完全消除条件 和 index
变量:
while (1) {
valueA = 0.88;
valueB = 0.88;
PID.A0 = 0.0012 * 15;
PID.A1 = -0.001 * 15;
valueA = 0.87;
valueB = 0.87;
PID.A0 = 0.0012 * 8;
PID.A1 = -0.001 * 8;
valueA = 0.86;
valueB = 0.86;
PID.A0 = 0.0012 * 6;
PID.A1 = -0.001 * 6;
valueA = 0.83;
valueB = 0.83;
PID.A0 = 0.0012 * 5;
PID.A1 = -0.001 * 5;
valueA = 0.79;
valueB = 0.79;
PID.A0 = 0.0012 * 3;
PID.A1 = -0.001 * 3;
valueA = 0.73;
valueB = 0.73;
PID.A0 = 0.0012 * 2;
PID.A1 = -0.001 * 2;
valueA = 0.71;
valueB = 0.71;
PID.A0 = 0.0012 * 1;
PID.A1 = -0.001 * 1;
valueA = 0.68;
valueB = 0.68;
} // end of while()