У меня есть два цикла for с ограничениями nr
и nc
, и я хочу ускорить код, вычисляя только те индексы, которые мне действительно нужно вычислить. У меня есть эти два кода, и я компилирую их с помощью gcc -O3.
Первый занимает всего около 3 секунд:
int i;
int j;
for(i=0; i<nr; i++){
for(j=0; j<nc; j++){
*(arr+i*nc+j) = fun(i,j);
}
}
И вторая функция (которая должна быть быстрее или, по крайней мере, не медленнее). , поскольку число циклов меньше или равно):
int i;
int j;
int oi;
int oj;
i = (px-d > 0) ? (px-d) : 0;
j = (py-d > 0) ? (py-d) : 0;
oi = (px+d < nr) ? (px+d) : nr;
oj = (py+d < nc) ? (py+d) : nc;
for(; i<oi; i++){
for(; j<oj; j++){
*(arr+i*nc+j) = fun(i,j);
}
}
px, py и d являются аргументами этих функций. Время выполнения:
первое: ~ 3 секунды
второе: ~ 4,3 секунды
Во второй функции есть еще несколько инструкций, но они должны быть действительно дешевыми по сравнению с подобными10.000 вызовов fun-функции через цикл. Я что-то здесь скучаю? Меняет ли эта «динамическая» инициализация i, j способ, которым gcc может оптимизировать код? Могу я что-нибудь с этим сделать?
Спасибо.