Что именно происходит при установке -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;
}
Скомпилируйте его с включенной и выключенной оптимизацией, изучите размеры файлов и даже включите параметр компиляции для генерации кода сборки. Обычно при включенной оптимизации размер кода может увеличиться из-за циклического развертывания. Хотя код можно оптимизировать, так как тело ничего не делает. Возможно, используйте счетчик изменчивых циклов, чтобы не оптимизировать его.