Превращение цикла в арифметику для ускорения функции
Привет, я нахожусь на пути к оптимизации функции, которая должна дать мне "что-то следующее". Пока что у меня есть
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
как только совпадение было найдено.
Как и ваш исходный код, предполагается, что в какой-то момент совпадение будет найдено.