domingo, 31 de maio de 2009

Otimizações do compilador GCC

Olá pessoal, esse pequeno post é para falar sobre compilação com otimização do compilador. Para isso vamos medir o tempo de execução de nosso programa.

Usei o exemplo do post anterior, de qualquer forma segue o código abaixo:
#include 
#include

double tempo()
{
struct timeval tv;
gettimeofday(&tv,0);
return tv.tv_sec + tv.tv_usec/1e6;
}

int main()
{
double t1,t2;
double i;
t1 = tempo();
printf("%lf\t",t1);

for(i=0;i<300000000;i++);

t2 = tempo();
printf("%lf\t",t2);

printf("%lf\n",t2-t1);
return 0;
}

Na hora de compilar um programa com o GCC você pode colocar alguns parâmetros, vamos usar:

-O1 Otimiza para tamanho do binário
-O2 Otimiza para desempenho de execução
-O3 Otimiza para Data cache

* Atenção é "O" (letra) e não "0" (número).

Vamos aos testes:

[helton2@hrpc ~]$ gcc teste.c -O1
[helton2@hrpc ~]$ ./a.out
1243797632.612002 1243797633.767017 1.155015

Neste exemplo o tamanho do binário ficou em 6329 bytes e demorou 1.155 segundos.


[helton2@hrpc ~]$ gcc teste.c -O2
[helton2@hrpc ~]$ ./a.out
1243797643.222072 1243797644.371347 1.149275

Neste exemplo o tamanho do binário ficou em 6345 bytes e demorou 1.149 segundos.

[helton2@hrpc ~]$ gcc teste.c -O3
[helton2@hrpc ~]$ ./a.out
1243797650.764788 1243797651.959029 1.194241

Neste exemplo o tamanho do binário ficou em 6409 bytes e demorou 1.194 segundos.

Compilando da forma padrão ...

[helton2@hrpc ~]$ gcc teste.c
[helton2@hrpc ~]$ ./a.out
1243797667.095339 1243797670.080635 2.985296

Neste exemplo o tamanho do binário ficou em 6369 bytes e demorou 2.985 segundos.

Como aqui estamos tratando de um problema fácil, apenas um simples "for" a diferença é pequena, mas com problemas mais complexos, sem dúvida essas opções de compilação podem dar um "up" no seu programa.

As opções aqui abordadas são válidas para a maioria dos compiladores C e C++ tanto em ambiente unix, linux, mac e windows.

Dica de Claudio Schepke. Obrigado!

Nenhum comentário:

Postar um comentário