2015-09-28 5 views
0

У меня есть следующий код:Что именно происходит, когда -O3 установлен

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

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

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

+2

Возможно, он понимает, что никакой побочный эффект цикла не используется и заменяет nop – amdixon

+1

. Предоставьте нам код сборки, сгенерированный gcc, если вы хотите узнать, что произошло в underhood. Прямо сейчас мы можем догадываться. Также я думаю, что в этом случае значение '// do something' имеет значение. – DawidPi

+5

Это многое зависит от того, что * делает что-то! –

ответ

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; 
} 

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

Смежные вопросы