Una de las cosas que más disfruto del blog, es cuando se genera un intercambio con los lectores. Y algo que realmente aprecio, es ser corregido (cuando tienen razón, ¿no? sino simplemente molesta…). Hay gente que se toma esto a mal, pero en mi caso, una de las grandes razones por las que creé el blog es para aprender. Y está buenísimo cuando alguien te corrige y aprendés algo nuevo.
¿A qué viene todo esto? Hace un tiempo (7 de abril) escribí en Twitter: ” Si haces un for hasta 6.000.000.000, la computadora se tranca…”. Y me faltó detallar un poco más a qué me refería, ya que recibí el siguiente correo de fcr:
de fcr
para fernando[arroba]picandocodigo.net
fecha 9 de abril de 2008 14:00
asunto respuesta a mensaje en twitter
¡Mentira, no se tranca nada!
fran@jariola:~/proj/video% cat for_loco.c #include <stdlib.h> int main(void){ for(uint64_t i=0; i<6000000000; i++); } fran@jariola:~/proj/video% cc for_loco.c -o for_loco -std=c99 -O2 fran@jariola:~/proj/video% time ./for_loco ./for_loco 0,00s user 0,00s system 66% cpu 0,001 total fran@jariola:~/proj/video%
Sin embargo, me faltó detallar las condiciones de mi experiencia. Para ser más preciso, mi mensaje debió decir “Si hacés un for hasta 6.000.000.000 programando en una máquina con Windows XP, en Visual Studio con el framework .NET 2.0, y ejecutás la aplicación que contiene dicho código con unas cuantas aplicaciones más abiertas, la máquina se cuelga”. Salió de una experiencia durante mi jornada laboral de ese día.
Si pruebo el código de fcr en mi máquina, con Debian GNU/Linux, y compilando el código en C por consola, efectivamente no se tranca:
fernando@nando-debian:~/DEVEL/C/for$ cc forLoco.c -o for_loco -std=c99 -O2 fernando@nando-debian:~/DEVEL/C/for$ time ./for_loco real 0m0.001s user 0m0.000s sys 0m0.000s fernando@nando-debian:~/DEVEL/C/for$
Bien, además de aprender que no se tranca, aprendí un par de cosas más:
-En sistemas GNU es equivalente escribir “gcc” o “cc” gcc.
-El parámetro “-std=c99″ le dice a gcc que intente usar el estándar C99.
-El parámetro “O” (en éste caso “-O2″), es para usar la optimización de GCC. -On, donde n es el nivel de optimización. También está -Os que optimiza para que el binario quede lo más chico posible.
Respecto a éste último punto, a rasgos muy generales puedo decir que GCC provee varias opciones para aumentar la velocidad o reducir el tamaño de los archivos ejecutables que genera. Éste tema tengo que darle un poco más de estudio.
Por ejemplo, miren el resultado si compilo el mismo código, sin el parámetro de optimización:
fernando@nando-debian:~/DEVEL/C/for$ cc forLoco.c -o for_loco -std=c99 fernando@nando-debian:~/DEVEL/C/for$ time ./for_loco real 0m29.273s user 0m29.182s sys 0m0.012s fernando@nando-debian:~/DEVEL/C/for$
Del IRC:
<fcr> fbt: nadie compila sin el -O2
<fcr> mirá si te asfixiás
Y todo esto lo aprendí por una pavada nomás, y unos minutos en irc. Si tendré C por aprender…
Si te gustó éste post, podés apoyar a PicandoCódigo a través de PayPal!
Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.8.0.7) Gecko/20061011 Fedora/1.5.0.7-7.fc6 Firefox/1.5.0.7
¿Quien más sino Francisco?
Lo de CC y ‘-std=c99? no tenia idea, lo de -O2 si, yo usaba -O3 para las tareas de facultad y de ahí me quedo.
Esta muy bueno el comentario del IRC.
Saludos.
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080417 BonEcho/2.0.0.14
bueno bueno bueno… sigo hace bastante (año pasado) el blog y la verdad, siempre es bueno leerte…
esta vez me decidi a comentar ya que estaba programando en C, algo no salia bien y vi que mi agregador de Rss (aka akregator) titilaba con 1 nuevo item…
Y ¬¬
C
C
C
C
C
C
¬¬
Dios que lenguaje precioso… a uno lo hace revolcarse ^^
en fin, a tener en cuenta el -O2
o el -Os pero estaria bueno encontrar info sobre cual valor darle (el mas correcto)
Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.7) Gecko/20070923 Firefox/2.0.0.7 (Swiftfox)
Esta bueno locos , la verdad eso de las opciones de compilacion vienen bien saberlas ..
Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Por qué el compilador no elimina el bucle? podrías poner el desensamblado?
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; es-es) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
Deberías poner contenido dentro del bucle, con -O2 (o posiblemente con -O1) GCC está optimizando tu código y posiblemente destruya ese bucle sin contenido, dejando tu programa en nada (por eso tarda tan poco).
Ponle una suma o asigna el contador del bucle a una variable para que veas que sucede.
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20070914 Mandriva/2.0.0.8-1mdv2008.0 (2008.0) Firefox/2.0.0.8
pasandole -O al gcc ya elimina el bucle.
Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.14) Gecko/20080417 Epiphany/2.22 Firefox/2.0.0.14
Interesante. En gentoo siempre se especifica los flags de optimización y anexas.
CFLAGS="-O2 -march=pentium4 -fomit-frame-pointer -pipe -msse2 -mfpmath=sse"
CHOST="i686-pc-linux-gnu"
MAKEOPTS="-j2"
Por acá opciones recomendadas para varios procesadores: http://gentoo-wiki.com/Safe_Cflags
Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.14) Gecko/20080417 Epiphany/2.22 Firefox/2.0.0.14
Qué pasa con mi comentario? :S
Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
C es como un tanque de guerra, imparable xD
Trackbacks y pingbacks:
Additional comments powered by BackType
Enlaces
- Re: List Category Posts WordPress Plugin support
- Re: List Category Posts WordPress Plugin support
- Re: List Category Posts WordPress Plugin support
- Re: List Category Posts WordPress Plugin support
- Add Tags Support (Here's how)
- Herramienta
- Re: List Category Posts WordPress Plugin support
- Re: List Category Posts WordPress Plugin support
- Re: List Category Posts WordPress Plugin new features request
- Re: List Category Posts WordPress Plugin support
\n\nRSS del foro:Últimos comentarios
Categorías
Blogroll