Что-то я не понимаю с моим кодом. Я работаю с avr-gcc и оптимизирую свой код для скорости. Я читал о циклах, подсчетах и позициях/pre (de), сравнении с 0 и обнаружил что-то странное.avr-gcc: loop with> = быстрее, чем> check
Этот код работает в 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) и счетчики пост/предопределений, но даже что оказалось, что я принимаю решение >= 0
или > 0
.
Может ли кто-нибудь объяснить, почему это так?
Вы уже разобрали двоичные файлы? –