avr-gcc:> =快于>的循环校验

时间:2016-06-01 07:23:43

标签: c performance avr-gcc

我的代码中有些东西我不明白。 我正在使用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是决定因素。

有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

UInt8 ret, i;

表示i >= 0始终为真。但必须对i > 0进行评估。

答案 1 :(得分:0)

忘掉你读到的有关循环,后递增,倒数到零等的所有内容。这不是微优化,而是纳米优化。它对代码速度产生任何影响的唯一方法是,如果你创建一个实际更改循环的代码。那就是如果通过玩你的循环你引入了错误。

特别是在像这样的情况下,你正在玩线程 - 所有非常昂贵的操作。是什么让你认为你改变你的变量有点重要?改变i是一个纳秒或更短的问题。除非你做了数百亿次,否则这对于运行43秒的代码有什么影响呢?

对于你的循环,使用正确的代码,这是可读的。