Улучшение времени выполнения за счет добавления автоматических переменных - PullRequest
0 голосов
/ 18 декабря 2018

Я играл на языке C самостоятельно и пытался написать самый быстрый из возможных алгоритмов для поиска дружных чисел .

Это то, что я написал (я только чтоначалось, поэтому, пожалуйста, не предлагайте мне методы улучшения алгоритма, так как я хочу написать его самостоятельно):

#include <stdio.h>
#include <time.h>

#define MAX (200000)

int dividersSum(int);
void amicable();

int main() {
    clock_t start = clock();
    amicable();
    double executionTime = ((double)clock() - start) / CLOCKS_PER_SEC;
    printf("\nEXECUTION TIME: %lf", executionTime);
    return 0;
}

int dividersSum(int n) {
    int i, sum;
    for (sum = 1, i = 2; i <= n / 2; i++) {
        if (!(n % i)) {
            sum += n / i;
        }
    }
    return sum;
}

void amicable() {
    int a, divSum, tot = 0;

    for (a = 1; a < MAX; a++) {
        divSum = dividersSum(a);
        if (divSum > a && dividersSum(divSum) == a) {
            printf("\n\t%d\t\t%d", a, dividersSum(a));
            tot++;
        }
    }

    printf("\n\nTOT: %d", tot);
}

Теперь это работает отлично.Или, по крайней мере, вероятно, не так хорошо, так как это заняло ровно 40 секунд, но это работает.

Но если я изменю эту строку:

int i, sum;

На это:

int i, sum, a = 4, b = 4, c = 4, d = 4, e = 4, f = 4;

Это "резко" улучшается.Это займет 36 секунд.

Я получаю эти времена выполнения из таймера консоли.Я знаю, что это совсем не точно (действительно, как только у меня появится возможность снова поработать с этим алгоритмом, я попытаюсь использовать библиотеку time.h), но я пробовал 2 версии кода более 50 раз, иЯ всегда получаю 40 или больше секунд для «нормальной» версии и 36 или меньше для другой.

Я также пытался сменить машину, на которой я запускаю программу, но для выполнения модифицированной версии всегда требуется примерно на 10% меньше.

Конечно, для меня это не имеет смысла (Я довольно новичок в программировании, и я прогуглил это, но ничего, даже не зная, что искать ...), единственное, о чем я могу думать, это оптимизация компилятора (я используюненавидел Dev c ++), но какая оптимизация?И если это так, то почему он не использует ту же оптимизацию и в «нормальном» коде, поскольку он делает его быстрее?


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

1 Ответ

0 голосов
/ 18 декабря 2018

Ну, я спросил своего преподавателя в университете.Он запустил две версии на своей машине, и в начале он был довольно удивлен (43 секунды - «нормальная» и 36 - быстрее).

Затем он сказал мне, что точно не знает, почемуслучается, но он предположил, что это происходит из-за способа, которым компилятор организует код.Вероятно, эти дополнительные переменные заставляют компилятор хранить код на разных страницах памяти, и именно поэтому это происходит.Конечно, он не был уверен в своем ответе, но он кажется мне справедливым.

Интересно, как такие вещи иногда могут происходить.


Более того, как Брендан сказал в разделе комментариев:

Если компилятор не игнорирует (или предупреждает о) неиспользуемые переменные (даже если это относительно тривиальная оптимизация), то компилятор пу (или плохв общем случае или ограничены параметрами командной строки), и ответ на ваш вопрос должен быть «компилятор poo» (например, не удается оптимизировать вторую версию в точно такой же выходной код, как в первой версии).


Конечно, если кто-то посчитает, что есть лучшее объяснение, я был бы рад выслушать его!

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