No responde la pregunta pero proporciona un ejemplo de optimización de tiempo de compilación. gcc optimiza el código cuando se le pide que lo haga. La opción -O (Optimizar) permite la optimización en diferentes niveles. Se puede usar como -O1, -O2 y -O3. La página del manual de gcc describe con precisión el significado de cada nivel.
La opción -S traduce C en ensamblaje y guarda en archivo .s.
test.c
#include <stdio.h>
int abc;//Global variable
void main()
{
abc = 3;
if(abc == 3)
printf("abc will be always 3");
else
printf("This will never executed");
}
Whitout optimización de gcc las dos cadenas aparecen en el código de montaje.
$ gcc -S test.c; gato test.s
.file "test.c"
.comm abc,4,4
.section .rodata
.LC0:
.string "abc will be always 3"
.LC1:
.string "This will never executed"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $3, abc(%rip)
movl abc(%rip), %eax
cmpl $3, %eax
jne .L2
movl $.LC0, %eax
movq %rax, %rdi
movl $0, %eax
call printf
jmp .L1
.L2:
movl $.LC1, %eax
movq %rax, %rdi
movl $0, %eax
call printf
.L1:
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
.section .note.GNU-stack,"",@progbits
nivel gcc Whit 1 optimización de una sola cadena se traduce en el conjunto de
$ gcc -S -O1 prueba. c; cat test.s
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "abc will be always 3"
.text
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $3, abc(%rip)
movl $.LC0, %edi
movl $0, %eax
call printf
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.comm abc,4,4
.ident "GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
.section .note.GNU-stack,"",@progbits
Lo más parecido a la optimización del tiempo de ejecución en C es la optimización basada en el perfil. Usted compila el programa, luego lo ejecuta, mientras utiliza un generador de perfiles para recopilar estadísticas. Luego compila de nuevo, dando estas estadísticas al compilador. La segunda compilación usaría esta información para generar código más rápido. – ugoren