c - avr-gcc:循环 >= 比 > 检查快

标签 c performance avr-gcc

我的代码有些地方不明白。 我正在使用 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/

相关文章:

javascript - 我可以通过在对象中定位属性来提高查找速度吗?

c++ - 将 Child 对象数组传递给接受 Parent* 的函数

c - 保证 int32_t 和 float 之间的数据保存?

c - 对 union 数据的原始访问

javascript - 是否减少 HTTP 请求?

c - 使用指针在字符串中出现单词

c++ - 为什么树向量化会使这种排序算法慢2倍?

c - AVR GCC,使用 Timer0 生成音调不起作用

c - 你好,编程和 C 语言新手,两周后,我的代码中有错误吗?

C - double 求和