Я играл на языке 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 ++), но какая оптимизация?И если это так, то почему он не использует ту же оптимизацию и в «нормальном» коде, поскольку он делает его быстрее?
О, если вам интересно, почему я пыталсяобъявлять случайные переменные, причина в том, что я хотел проверить, было ли измеримое ухудшение в использовании большего количества переменных.Теперь я знаю, что это очень глупый способ проверить это, но, как я сказал в начале поста, я «играл» ...