Что именно происходит при установке -O3

У меня есть следующий код:

int main()
{
int i=0;
for(i=0;i<10000000;i++)
        //do something
return 0;
}

Когда я запускаю этот код с помощью команды 'gcc -o file file.c', он выполняется за 244 миллисекунды, а когда я выполняю тот же код с помощью 'gcc -O3 file.c -o file', он выполняется за 0 миллисекунды (очень мало времени, которое отображается как ноль). Я не мог понять, какую оптимизацию выполняет флаг -O3 таким образом, что мы получаем большую скорость выполнения.

Любая ссылка, документ или объяснение относительно оптимизации "-O3" (кроме gcc.gnu.org, который я видел и нашел предоставленную там информацию, недостаточно, чтобы дать мне достойное объяснение и понимание того, что происходит) очень много оценили.

1 ответ

В конечном итоге нам нужно знать, что //do something делает. Вы должны вставить свой точный код, который вы использовали, потому что технически оператор return будет выполнен как тело цикла.

Если у вас было что-то вроде этого:

int main()
{
    int i=0;
    int junkInteger = 0;
    for(i=0; i < 5 ;i++)
    {
        junkInteger++;  // just to have a body
    }
    return 0;
}

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

int main()
{
    int i=0;
    int junkInteger = 0;

    // loop gets unrolled
    junkInteger++;
    junkInteger++;
    junkInteger++;
    junkInteger++;
    junkInteger++;
    return 0;
}

Когда цикл развернут, сборка / машинный код низкого уровня не должны выполнять загрузку, сохранение, сравнение и ветвление для управления циклом.

Вы должны попробовать свой код еще раз с этим:

int main()
{
    int i=0;
    for(i=0;i<10000000;i++)
    {
        //do something
    }
    return 0;
}

Скомпилируйте его с включенной и выключенной оптимизацией, изучите размеры файлов и даже включите параметр компиляции для генерации кода сборки. Обычно при включенной оптимизации размер кода может увеличиться из-за циклического развертывания. Хотя код можно оптимизировать, так как тело ничего не делает. Возможно, используйте счетчик изменчивых циклов, чтобы не оптимизировать его.

Другие вопросы по тегам