GCC compilar com opcao ( -O2 )

1. GCC compilar com opcao ( -O2 )

???
gokernel

(usa Linux Mint)

Enviado em 11/07/2012 - 19:36h


Olá pessoal !!!

Estava testando alguns modelos de como fazer "bytecode" em um programa ... entao por curiosidade compilei com a opção( -O2 ) do GCC...

Tive um grande "susto e alegria" ;)
01 - Antes o meu bytecode demorava( +ou- 2.106 segundos) para fazer um loop ( 100 000 000 ) e incrementar um "register" e comparar.

02 - Depois de compilado com ( -O2 ) executou em apenas ( 0.889 segundos ) ... OTIMO.


Entao vai a pergunta:
A opção ( -O2 ) do GCC faz exatamente o que ???

Grato !




  


2. Re: GCC compilar com opcao ( -O2 )

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/07/2012 - 21:22h

dê uma lida nesse artigo sobre os parâmetros do GCC:

http://onlamp.com/pub/a/onlamp/2007/04/03/getting-familiar-with-gcc-parameters.html?page=1

procure pelo título "Parameters Related To Code Optimization".



3. Re: GCC compilar com opcao ( -O2 )

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 12/07/2012 - 00:06h

as flags de otimização ativam vários métodos de otimização de código, desde as mais triviais, como remoção de código morto, eliminação (ou redução) de expressões em comum, propagação de constantes, otimizações de loop, como por exemplo o remanejo de código estático, otimizações de realocação de registradores, otimizações de assinatura única de variáveis, entre dezenas de outras formas - sendo que cada forma de otimização comporta várias otimizações. seria inviável listar e exemplificar todas por aqui.
as otimizações ocorrem em todos os estágios do processo da compilação (pré-processamento, tradução, códigos intermediário (ast/gimple), baixo nível (rtl/asm) e máquina, e finalmente a montagem). e mais, as otimizações utilizadas pelo compilador durante o processo dependerão do código a ser traduzido. portanto, é difícil responder sua pergunta e dizer quais otimizações ocorreram sem conhecer seu código. mas apenas para fins de observação, gere o código asm (flag -S) com e sem otimizações e analise as diferenças.

sugiro que leia um artigo que escrevi há alguns anos e que faz justamente essa análise rápida, porém utilizando o compilador VC6 da Microsoft - mas que pode ser tomado como referência para visualizar o que ocorre com o seu código de saída no GCC ou em qualquer outro compilador C moderno.
http://www.codeproject.com/Articles/4407/Compiler-s-Code-Optimization-The-Dark-Side
(em inglês - e inglês ruim eheh)

e uma consideração importante: nem sempre a otimização é benéfica. essa é, inclusive, a razão pela qual as otimizações devem ser ativadas manualmente. de outra forma, seria mais cômodo que todas as otimizações estivessem ativadas por default, a fim de sempre obter a saída o mais otimizada possível. mas cada caso é um caso. aplicações e/ou funções/trechos críticos nem sempre devem ser otimizadas. para esses casos, pode-se não ativar as flags O ou ainda especificar em código onde não devem ser aplicadas otimizações.

para saber as otimizações ativadas pelos diversos níveis do GCC, consulte essa página:
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html


4. Re: GCC compilar com opcao ( -O2 )

???
gokernel

(usa Linux Mint)

Enviado em 12/07/2012 - 19:22h


Olá pessoal, grato pelo retorno !!!

Muito boa essas dicas, e o simples codigo para teste é este:



#include <stdio.h>
#include <time.h>

typedef struct Tasm Tasm;

struct Tasm {
int cmd; // opcodes: END, NOP, INCA, CMPA, JMP
int arg; // argument value;
};

enum {
END = 0,
NOP,
INCA,
CMPA,
JMP
};

void run (Tasm *code)
{
register int i = 0;
register int a = 0; // <<<< REGISTER ;)

while (code[i].cmd)
{
register int op = code[i].cmd;

switch (op)
{
case NOP: break;

case INCA: a++; break;

case CMPA: if (a != code[i].arg) i++; break;

case JMP: i = code[i].arg-1; break;
}

i++;
}
}


int main (int argc, char *argv[])
{
Tasm code[]={
{INCA}, // increment the "register" a
{CMPA, 100000000}, // compare a == 100 000 000
{JMP, 4}, // goto index 4 ... end
{JMP, 0}, // goto index 0
{END}
};

clock_t init = clock (); // get the first time to compare

run (code);

clock_t end = clock (); // get the second time to compare

printf ("TIME: %ld\n", end - init); // time compare

return 0;
}



Mas estou usando um modelo de "bytecode" mais rapido, esse aqui:
http://byteworm.com/
BY: Benjamin Kittridge. Copyright (C) 2010, All rights reserved.



5. Re: GCC compilar com opcao ( -O2 )

???
gokernel

(usa Linux Mint)

Enviado em 13/07/2012 - 18:49h


E quem quiser ver meu projeto de um TINY BYTECODE esta aqui:

http://code.google.com/p/jbc/downloads/list

Atualizei hoje(13/07/2012), ajuda e sugestoes sao bem vindas ...

A fase 2 eh implementar um tradutor de C para o "bytecode" ...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts