Почему результат выполнения показывает большую разницу в режиме выпуска и режиме отладки? - PullRequest
0 голосов
/ 01 ноября 2018
# include <stdio.h>
# include<time.h>
# include <limits.h>

int main() {
    clock_t start;
    long a = 0;
    long b = 0;

    start = clock();
    for (int i = 0; i < INT_MAX; i++) {
        for (int j = 0; j < INT_MAX; j++) {
            for (int k = 0; k < INT_MAX; k++) {
                for (int q = 0; q < INT_MAX; q++) {
                    b = 1;
                }
            }
        }       
    }
    printf("%.5f\n", ((float)(clock() - start) / CLOCKS_PER_SEC));

    start = clock();
    for (int i = 0; i < INT_MAX; i++) {
        for (int j = 0; j < INT_MAX; j++) {
            for (int k = 0; k < INT_MAX; k++) {
                a = 0;
                for (int q = 0; q < INT_MAX; q++) {
                    a += 1;
                }
            }
        }
    }
    printf("%.5f\n",((float)(clock()-start)/CLOCKS_PER_SEC));   
}

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

Я знаю, что режим релиза быстрый, но как он может быть таким быстрым?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Чтобы развернуть этот ответ , даже если вы используете a и b , как в выражении printf после вложенного петли, петли все еще могут быть оптимизированы. Почему?

Ваш предел цикла - это константа , которая известна во время компиляции. Таким образом, компилятор будет фактически вычислять, что будет a в конце во время компиляции.

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

Но не используйте огромное количество, такое как MAX_INT, потому что это займет очень и очень много времени - даже на быстрой машине. Вот почему вы наблюдаете это:

Но когда я запускаю в режиме отладки, это еще не конец.

Программа работает вечно, верно?

Число около 1000 даст вам разумное, измеримое время.

0 голосов
/ 01 ноября 2018

При оптимизации компилятор может увидеть, что этот код:

for (int i = 0; i < INT_MAX; i++) {
    for (int j = 0; j < INT_MAX; j++) {
        for (int k = 0; k < INT_MAX; k++) {
            for (int q = 0; q < INT_MAX; q++) {
                b = 1;
            }
        }
    }       
}

можно просто заменить на

b = 1;

Аналогичным образом можно оптимизировать второй блок цикла.

Далее, поскольку a и b не используются, петли могут быть полностью удалены.

Таким образом, вся ваша программа может быть оптимизирована в нечто, представляющее:

int main() {
    clock_t start;
    start = clock();
    printf("%.5f\n", ((float)(clock() - start) / CLOCKS_PER_SEC));
    start = clock();
    printf("%.5f\n",((float)(clock()-start)/CLOCKS_PER_SEC));   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...