Ahí va una pequeña lista de consejos para optimizar código c++ que en algunos casos por tontos que parezcan pueden repercutir en la velocidad de procesamiento del código notablemente.
Recuerda que el código más rapido y más optimizado es aquel que no es ejecutado, con esto quiero decir que en muchas ocasiones consumimos recursos innecesarios por lo hábitos adquiridos con el tiempo.
Optimiza los bucles
Siempre que sea posible, realiza el bucle en negativo en vez de en positivo esto quiere decir de n a 0 y no de 0 a n.
Ejemplo:
for (i = n-1; i >= 0; --i)
en vez de
for (i = 0; i < n; ++i)
Tmabien fijate en el detalle de que ++i es más rápido que i++ siempre y cuando estos aparecen dentro de un bucle.
Usa 'int'
Siempre que te sea posible utiloza el tipo int en vez de char o short.
La explicación es que un tipo int tiene un tamaño entre el de short y el de long, ambos inclusive, preferentemente el tamaño de un apuntador de memoria de la máquina, por lo que es el más comun para todas las máquinas.
Estos son los distintos tipos de los que dispones en c++:
1. Enteros
1. int
2. long int
3. long long
4. short
5. char
6. wchar_t
2. Flotantes
1. float (IEEE754 Simple)
2. double (IEEE754 Normal)
3. long double (IEEE754 Extendido)
Declara las funciones locales cómo estáticas
Intenta declarar todas tus funciones locales cómo funciones locales estáticas.
static void foo()
Esto hará que estas funciones no sean visibles desde fuera del archivo .cpp, ademas algunos compiladores tienen un funcionamiento m´ñas óptimo con ellas.
Optimiza tus declaraciones "IF"
Usa por ejemplo:
bar();
if (condition)
{
undoBar();
foo();
}
en vez de:
if (condition)
{
foo();
}
else
{
bar();
}
La explicación es muy sencilla el primer ejemplo es más sencillo, para el compilador es más pesado tener que realizar las dos condiciones if, else.
Optimiza los switch
Muy sencillo pon los casos más comunes en primer lugar de este modo nos ahorraremos unos cuantos saltos...
Optimiza las pequeñas operaciones
Sumar es más ligero que multiplicar y multiplicar es más ligero que dividir por lo tanto intenta evitar las multiplicaciones y divisiones siempre que sea posible.
Inicializa las variables en la declaración
Siempre que sea posible inicializa las variables al mismo tiempo que esta son declaradas.
Por ejemplo:
TMyClass myClass = data;
es más rapido que:
TMyClass myClass;
myClass = data;
Pasa las variables por referencias
Intenta pasar las clases por referencias en lugar de pasarlas cómo valores.
Por ejemplo:
void foo(TMyClass &myClass)
mejor que:
void foo(TMyClass myClass)
Cuidado al concatenar y sumar valores
Es mejor:
myClass += value;
que...
myClass = myClass + value;
Es mejor el primer ejemplo puesto que evita el crear un objeto adicional.
Enlaces Relacionados
6 cosas que probablemente no conozcas sobre PHP
PHP y MySql una estrecha relación
Las 10 mejores librerías
Howto encriptar passwords en la base de datos
El framework más popular de Ajax
Manual y ejemplos con Smarty
8 lenguajes de programación que deberías aprender
Generar documentos OpenOffice con PHP
Entrevista a Marten Mickos, CEO de MySql
Urls amigables
Fácil sistema de autentificación (login, password) PHP
Bases de datos y PHP
Enlaces Relacionados
- Los orígenes del modelo vista controlador
- Herramientas para acelerar la carga de páginas web
- Demoscene (64KB generando 1.9GB)
- Cover Flow
- Técnica de generación procedural (64KB generando 1.9GB)
- Principios de la Ingeniería del Software
- Los mejores IDEs para Php
- Zend Studio
- Las herramientas más útiles para desarrolladores Php
- Nueva versión de Notepad++ 4.0





coman miarda cerotes todo lo
coman miarda cerotes todo lo que dicen es basura
POnganse a jalar bola de
POnganse a jalar bola de pendejos
Tonterias...
Armando Mdz, sabes que 0 es igual a false?? por tanto, si i=N, while(i--) parará cuando i=0...
El comentario de Fabián
El comentario de Fabián Sierra C. lo veo muy incorrecto ya que al escribir codigo en c++ y verlo en ensamblador se va a obserbar muchos de estos puntos como siertos ya que te ahorran lineas en ensamblador lo que significa un codigo mas rapido (no deveria de opinar en algo que no esta seguro y solo lo basa en conjeturas propias) aunque tambien cabe destacar que estos consejos no sirven de mucho en aplicaciones que el programador comun hace.
Por ejemplo:
"La manera de optimizar un bucle de ese tipo es sencillamente escribir
i = N;
while(i--)
{
}"
Esto no sirve ya que daria un ERROR inaceptable para un programador que segun tiene años, cuando se escribe un WHILE entre los parentesis se tiene que escribir una CONDICION y el esta dando una ASIGNACION y esto es completamente diferente
"El cuarto consejo, sobre optimizar los if, es una soberana estupidez. ¿Quieres decir que es más rápido llamar a una función (undobar) que no llamarla por usar un else? Sea lo que sea que haga undobar, las llamadas a funciones exigen más código, y más lento, que una condición if/else."
Y bueno hay mas cosas que luego pondre por ahora ya me voy a trabajar
Saludos!!!
una asignacion es una
una asignacion es una expresion y cualquier expresion arroja un valor, en el caso de
while(i--)
{
}
i--, arroja un valor, es decir, por ejemplo i=5, entonces seria
while(5)
{
}
y cualquier valor en C o C++ diferente de cero se evalua como verdadera, por lo tanto el cuerpo de while se ejecuta, despues i se hace 4, lo que es diferente de cero, por lo que se ejecutaria hasta que i sea igual a cero
No son tonterias
Hola. Puede que estos consejos no te den un incremento de rendimiento abrumador, pero si que son buenos consejos. Yo también posteé esta noticia en mi blog porque me parecía interesante (eso sí, dando la referencia de donde saqué la información :P). Ahora quería dar mi humilde opinión sobre un par de cosas, sabiendo de lo que hablo claro está, ya que estoy apunto de terminar la licenciatura de informática.
En cuanto a los bucle for, es cierto que actualmente los los procesadores vienen con un repertorio de instrucciones que incluyen tanto instrucciones de incremento como de decremento y seguramente no difieran en ciclos de ejecución del procesador, pero creo que normalmente la instrucción de comparación más trivial para los computadores es la comparación con 0, ya que existe un registro dedicado en el juego de registros de los procesadores que contiene siempre dicho valor, y por lo tanto seguramente esto suponga una mejora. (Todo esto son suposiciones, que se que se daban en procesadores antiguos, pero con los nuevos no puedo afirmarlo con certeza).
Respecto a los switch también considero buena esta práctica, ya que un switch a fin de cuentas se traduce en código ensamblado a comparaciones, y estas comparaciones se realizan en el orden que especifiquemos en el switch. Si tenemos un caso que sabemos que se va a repetir más que otros, y tenemos 1000 cases (por exagerar un poco), si ponemos ese caso en primer lugar solo se va a realizar una comparación, pero si lo ponemos en el último caso se realizarán 1000 comparaciones.
guaajajajajaja
guaajajajajaja
idiotas
guajajajajaja tu madre triplehijueputa
No son más que tonterías
Todos los consejos, excepto uno, son tonterías. Se basan en la suposición de que todos los compiladores y todos los procesadores funcionan igual.
El primer consejo, "realiza el bucle en negativo en vez de en positivo" hace varias asunciones erróneas. La más grave de ellas es que i-- es más rápida que i++. No hay razón para que eso sea verdad en todos los compiladores ni en todos los procesadores. En los procesadores que dispongan de una instrucción equivalente a "inc" pero no una equivalente a "dec", probablemente sea más rápido utilizar i++; pero más probable aún es que ambas sean exactamente iguales.
La manera de optimizar un bucle de ese tipo es sencillamente escribir
i = N;
while(i--)
{
}
, pero no porque i-- sea más veloz, sino porque evita una comprobación y porque funciona correctamente con tipos signed y unsigned. Si no la entiendes, piénsala un poco. (fuente: Código sin errores, Microsoft Press)
El segundo consejo es correcto. En efecto, int debiera ser el tipo de datos más eficiente en todas partes.
El tercer consejo, "Intenta declarar todas tus funciones locales cómo funciones locales estáticas" no acelera en nada la ejecución. Sólo hace que las funciones no sean visibles fuera del fuente en el que fueron declaradas. Si sólo llamas a la función localmente, no afectará en nada a la ejecución el que desde otros módulos no sea visible. Sí es una buena práctica de programación, ya que aumenta la encapsulación del código, pero no aumenta la velocidad.
El cuarto consejo, sobre optimizar los if, es una soberana estupidez. ¿Quieres decir que es más rápido llamar a una función (undobar) que no llamarla por usar un else? Sea lo que sea que haga undobar, las llamadas a funciones exigen más código, y más lento, que una condición if/else.
El quinto consejo, poner los casos más frecuentes al principio de los switchs, es una tontería. Está asumiendo que hay que hacer varios saltos para llegar más lejos, lo que puede haber sido cierto en algunos procesadores (como el 8080), pero ciertamente no en todos, ni siquiera en la mayoría.
El sexto consejo, que es más rápido sumar que multiplicar, es correcto. No veo para qué puede servir cuando necesitas multiplicar y no sumar. Si estás pensando que es más rápido hacer un bucle de sumas sucesivas que multiplicar, te equivocas. La mayoría de los procesadores incluye una instrucción de multiplicación de enteros que es muy veloz.
El séptimo consejo es más complicado de decidir. Depende del compilador. En el primer caso se utiliza el operador de asignación, en el segundo el constructor de copia, y no hay razón para suponer uno más rápido que el otro. Además, tienes que haberlos implementado.
El octavo consejo es correcto para los tipos de datos de tamaño mayor que un puntero. Cuando el tamaño es igual al de un puntero, nada se gana, y se pierde por la posibilidad de modificar inadvertidamente el valor pasado por referencia.
El noveno consejo depende del compilador y de la implementación. Ciertamente, no has explicado que para que funcione, en primer lugar debes haber implementado el operador += para esa clase.
Y antes de que preguntes, llevo más de 6 años programando profesionalmente, y he hecho algunos motores gráficos como diversión. Sé de lo que hablo. En cambio, tú has copiado la información desde otro sitio, probablemente http://www.custard.org/~andrew/optimize.php , y te lo has callado.
Tu sí sabes de lo que hablas.
Nada más eso. Todo lo que acabas de decir es correcto. El que escribio esto no sabe muy bien qué onda. :P Debe aprovechar para aprender de lo que acabas de decir.
Tu no eres programador, verdad...?
De verdad, espero que no seas programador profesional porque vaya lindeza de consejos que has puesto amigo.
Muchas cosas son directamente mentira y en otras, siempre es preferible claridad en el código que 'optimizaciones' que no sirven para mucho (en la inmensa mayoría de aplicaciones).
Sin acritud :-)
recomendacion de paginasa
si usted es programador mandeme imformacion de corso de C++ o
paguina web
Son trucos para hacer
Son trucos para hacer código más eficiente, obviamnete ya es cosa de cada uno el utilizarlos o no....
Un abrazo
¿Y tú no has programado
¿Y tú no has programado alguna vez un motor gráfico verdad? Todas esas lindezas son DE OBLIGADO CUMPLIMIENTO cuando lo único que prima es la velocidad. Aunque bien es cierto que algunas cosas son discutibles porque los compiladores optimizan por sí mismos muchas expresiones aunque las escribamos a lo burro y realmente no hace falta sabérselas. Aun así, el autor no dice en ningún momento que programar así sea programar mejor, sino que es programar basándose en el rendimiento. Si programas en Java desde luego sería estúpido atender a estos consejos y sería más importante atender a la reusabilidad y el mantenimiento. Critiquemos por criticar :D, sin acritud ;)
Lo que dice el Anónimo...
es verdad. Muchas de las cosas que están escritas aquí no son ciertas.
Enviar un comentario nuevo