Улучшить время обработки для расчета массива - PullRequest
1 голос
/ 24 ноября 2010

Код выглядит следующим образом: + = массив [j] + массив [j + 1] + массив [j + 2] + ... массив [j + n];как заменить j + n внутри скобки, чтобы улучшить время?

Ответы [ 3 ]

7 голосов
/ 24 ноября 2010

Вы не делаете это.Если у вас нет мертвого компилятора, он сможет оптимизировать его достаточно адекватно.

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

Вам также нужно будет лучше разбираться в тонкостях вашей целевой платформы, чем люди, которые пишут ваш компилятор, которыйоткровенно говоря, основанный на безумном коде, который я видел от gcc на высоких уровнях оптимизации, маловероятно: -)

Обычно вы получите больший возврат инвестиций, если сосредоточитесь на оптимизации общего изображениянапример, выбор алгоритма и т. д.

То, что вы должны сделать (если вы еще этого не сделали), это профилировать код, когда он будет завершен, чтобы увидеть узкие места (и только , если он работает хуже: нет смысла оптимизировать что-то, что уже работает достаточно быстро).

Тогда сконцентрируйся на этих узких местах. Мера, не угадай!


В качестве примера, я собирался показать вам, насколько хорошо оптимизирован следующий код:

#include <stdio.h>
int main(void) {
    int j, sum, array[50];
    for (j = 0; j < 50; j++)
        array[j] = 999 - j * 2;
    j = 22;
    sum = array[j] + array[j+1] + array [j + 2] + array[j + 3];
    return 0;
}

но на уровне оптимизации gcc 3 он стал:

main:
    pushl   %ebp         ; prolog
    xorl    %eax, %eax   ; return value
    movl    %esp, %ebp   ; epilog 1
    popl    %ebp         ; epilog 2
    ret

Да, все верно, это всего лишь пролог стека и код эпилога и установка возвращаемого значения, без каких-либо вычислений в поле зрения.gcc (правильно) выяснил, что ни один из расчетов нигде не используется, поэтому полностью их оптимизировал.


Как только вы его используете, соответствующий код становится простым:

movl    116(%esp), %eax
addl    112(%esp), %eax
addl    120(%esp), %eax
addl    124(%esp), %eax

и вам будет тяжело получить его гораздо более оптимизированным.

3 голосов
/ 24 ноября 2010

Почему бы не

T* aj = &(array[j]);
sum = aj[0] + aj[1] + ...

?

0 голосов
/ 24 ноября 2010
int *aj

aj = &(array[j]);

правильно, а сумма равна

sum += *aj + *(aj+1) + *(aj+2) ....

Он обязательно выполнит ваш код, если вы начнете с

aj = &(array[0]);

, а затем просто добавьте к aj

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...