Есть ли альтернатива использованию% (модуль) в C / C ++? - PullRequest
32 голосов
/ 07 сентября 2008

Я где-то однажды читал, что оператор модуля неэффективен на небольших встроенных устройствах, таких как 8-битные микроконтроллеры, которые не имеют инструкции целочисленного деления. Возможно, кто-то может это подтвердить, но я подумал, что разница в 5-10 раз медленнее, чем с целочисленной операцией деления.

Есть ли другой способ сделать это, кроме хранения переменной счетчика и ручного переполнения до 0 в точке мода?

const int FIZZ = 6;
for(int x = 0; x < MAXCOUNT; x++)
{
    if(!(x % FIZZ)) print("Fizz\n"); // slow on some systems
}

против

То, как я сейчас это делаю:

const int FIZZ = 6;
int fizzcount = 1;
for(int x = 1; x < MAXCOUNT; x++)
{
    if(fizzcount >= FIZZ) 
    {
        print("Fizz\n");
        fizzcount = 0;
    }
}

Ответы [ 13 ]

0 голосов
/ 12 сентября 2008

Оператор print займет на несколько порядков больше, чем даже самая медленная реализация оператора модуля. Таким образом, комментарий «медленно в некоторых системах» должен быть «медленным во всех системах».

Кроме того, два предоставленных фрагмента кода не делают одно и то же. Во втором - строка

if(fizzcount >= FIZZ)

всегда ложно, поэтому «FIZZ \ n» никогда не печатается.

0 голосов
/ 07 сентября 2008

@ Джефф V: я вижу проблему с этим! (Кроме того, ваш исходный код искал мод 6, а теперь вы, по сути, ищете мод 8). Вы продолжаете делать дополнительный +1! Надеюсь, ваш компилятор оптимизирует это, но почему бы не просто начать тест с 2 и перейти на MAXCOUNT включительно? Наконец, вы возвращаете true каждый раз, когда (x + 1) НЕ делится на 8. Это то, что вы хотите? (Я предполагаю, что это так, но просто хочу подтвердить.)

0 голосов
/ 07 сентября 2008

Не то чтобы это обязательно лучше, но у вас может быть внутренний цикл, который всегда идет до FIZZ, и внешний цикл, который повторяет все это определенное количество раз. Тогда вы, возможно, дойдете до особого случая последних нескольких шагов, если MAXCOUNT не делится равномерно на FIZZ.

Тем не менее, я бы предложил провести некоторые исследования и профилирование производительности на ваших предполагаемых платформах, чтобы получить четкое представление об ограничениях производительности, под которыми вы находитесь. Там могут быть гораздо более продуктивные места, чтобы потратить ваши усилия по оптимизации.

...