Превращение цикла в арифметику для ускорения функции

Привет, я нахожусь на пути к оптимизации функции, которая должна дать мне "что-то следующее". Пока что у меня есть

  int fun(int a){
    const int k = ...;
    for(;test_value(a++) != k;);
    return a;
   }

Это был быстрый и грязный способ проверить, что мой алгоритм действительно работает, но теперь я беспокоюсь, что цикл делает тест на ветвление на каждой итерации (если не компилятор очень хорошо справляется с этим за кулисами?). Допустим, вероятность того, что любой тест выполнит тест, составляет не более 1/5, а наихудшие случаи - один на миллион, но значение test_value - всего лишь один или два такта. Есть ли какой-то систематический способ помочь моему компилятору торговать всеми ветвями с помощью арифметики, чтобы лучше использовать конвейеры ЦП?

1 ответ

Решение

Вы можете немного "развернуть" свой цикл, например:

int nomatch = 1;
while( nomatch ){
    nomatch   = (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
    nomatch &&= (test_value(a++) != k);
}

Это дало бы меньше итераций, а короткое замыкание помешало бы оценкам test_value как только совпадение было найдено.

Как и ваш исходный код, предполагается, что в какой-то момент совпадение будет найдено.

Другие вопросы по тегам