我的代码中有些东西我不明白。 我正在使用avr-gcc并优化我的代码以提高速度。我已经读过关于循环,倒计时和后/前(de)创造,与0比较并发现奇怪的东西。
此代码运行于47s:
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);
这段代码在43s:
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;
}
}
此代码再次出现在47s:
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)和post / predecrement计数器的值,但最终发现看来我是使用>= 0
还是> 0
是决定因素。
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
UInt8 ret, i;
表示i >= 0
始终为真。但必须对i > 0
进行评估。
答案 1 :(得分:0)
忘掉你读到的有关循环,后递增,倒数到零等的所有内容。这不是微优化,而是纳米优化。它对代码速度产生任何影响的唯一方法是,如果你创建一个实际更改循环的代码。那就是如果通过玩你的循环你引入了错误。
特别是在像这样的情况下,你正在玩线程 - 所有非常昂贵的操作。是什么让你认为你改变你的变量有点重要?改变i是一个纳秒或更短的问题。除非你做了数百亿次,否则这对于运行43秒的代码有什么影响呢?
对于你的循环,使用正确的代码,这是可读的。