我的代码有些地方不明白。 我正在使用 avr-gcc 并优化我的代码以提高速度。我读过有关循环、倒计时和后/前(递减)递减、与 0 的比较并发现了一些奇怪的东西。
此代码在 47 秒内运行:
UInt8 ret, i;
i = UJ_THREAD_QUANTUM;
do {
ret = ujThreadPrvInstr(h, t);
if (ret == UJ_ERR_RETRY_LATER) {
// do not bother with the rest of time quantum if we're already stuck
ret = UJ_ERR_NONE;
break;
}
died = (t->pc == UJ_PC_DONE);
if (died) {
break;
}
if (ret != UJ_ERR_NONE) {
break;
}
} while(--i);
这段代码在 43 秒内:
for (i = UJ_THREAD_QUANTUM; i >= 0; --i) {
ret = ujThreadPrvInstr(h, t);
if (ret == UJ_ERR_RETRY_LATER) {
// do not bother with the rest of time quantum if we're already stuck
ret = UJ_ERR_NONE;
break;
}
died = (t->pc == UJ_PC_DONE);
if (died) {
break;
}
if (ret != UJ_ERR_NONE) {
break;
}
}
这段代码又用了 47 秒:
for (i = UJ_THREAD_QUANTUM+1; i > 0; --i) {
ret = ujThreadPrvInstr(h, t);
if (ret == UJ_ERR_RETRY_LATER) {
// do not bother with the rest of time quantum if we're already stuck
ret = UJ_ERR_NONE;
break;
}
died = (t->pc == UJ_PC_DONE);
if (died) {
break;
}
if (ret != UJ_ERR_NONE) {
break;
}
}
考虑到我可能误解了一些内部工作原理,我改变了 UJ_THREAD_QUANTUM
的值(默认为 10)和后/前递减计数器,但最终发现我是否使用 >= 0
或 > 0
是决定因素。
谁能解释这是为什么?
最佳答案
UInt8 ret, i;
表示 i >= 0
始终为真。但是 i > 0
必须被评估。
关于c - avr-gcc:循环 >= 比 > 检查快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562025/