Google
 

miércoles, octubre 10, 2007

Mitos sobre C/C++

La gente suele asociar a C/C++ como el lenguaje de programación más rápido sobre la faz de la tierra (con perdón del ensamblador). Me gustaría recalcar varias cosas :

- Primero que C++ es más lento que C.

- Que el lenguaje más rápido, aunque no suele aparecer en las comparativas, es Fortran.

- Que lenguajes que la gente suele pensar que son interpretados (normalmente porque suelen ser lenguajes que se pueden ejecutar en modo interpretado o en modo compilado) como Lisp pueden llegar a ser más rápidos que C++.

- A pesar de haber lenguajes tan rápidos como C pero de más alto nivel (OCaml) la gente no suele ni siquiera plantearse la posibilidad de escribir el programa en algo que no sea C, incluso aunque ello signifique menos bugs y menor tiempo de desarrollo (Wings3D está escrito en erlang).

- Que aunque las STL en C++ son tremendamente lentas comparadas con una alternativa escrita en C (hasta unas siete veces) la gente sigue usándolas en situaciones críticas.

Aunque sigáis programando en C/C++ espero al menos haberos metido en el cuerpo "el gusanillo de la duda".

7 comentarios:

Javi Santana dijo...

Totalmente de acuerdo. Yo lo extrapolaría a que para cada aplicación existe un lenguaje adecuado y está claro que un lenguaje nunca va a poder abarcar todos los ámbitos

Anónimo dijo...

Este post me ha sido útil, porque estoy viendo si utilizar Fortran o C para simulación numérica.

Cyttorak dijo...

Hombre, en los test esos se usa el VC++ 6.0, digo yo que algo habrá mejorado el 2003 o el 2005.

No se si el más rápido es el Fortran, pero hay casos de computación numérica donde los templates de C++ y las STL pueden batir a Fortran.

Lo de que C++ es más lento que C no lo veo.

Desde luego, en lo que sí estoy de acuerdo es que C++ tiene algunas cosas muy tocahuevos y que para ciertas aplicaciones es mucho mejor usar otros lenguajes/entornos, como C# para aplicaciones tipo windows por ejemplo, donde no es necesario una velocidad o control de lo que hace el código patológicamente alto.

Anónimo dijo...

Las cinco afirmaciones son gratuitas, como lo son la mayoría de afirmaciones absolutas del estilo "a es n veces más lento/menos productivo/etc. que b".

Decir, en pleno 2007, que C++ es más lento que C (¿desde cuándo una especificación escrita en un libro es más o menos rápida que otra?) o que su librería estándar (que es a lo que supongo que te refieres al escribir STL) es tremendamente lenta en comparación con una alternativa escrita en C es cuanto menos sorprendente.

Victor M. dijo...

anómino alias troll

Es un ejemplo tonto pero sirve:

1.c:
#include <stdio.h>
int suma(int a, int b) {
return a + b;
}
int main() {
printf("suma %d\n", suma(1, 2));
return 0;
}


2.cc:
#include <iostream>
class ISuma {
public:
virtual int ejecuta(int a, int b) = 0;
};
class suma : public ISuma {
public:
int ejecuta(int a, int b) {
return a + b;
}
};
int main() {
suma s;
std::cout << "suma " << s.ejecuta(1, 2) << std::endl;
return 0;
}


3.cc:
#include <iostream>
int suma(int a, int b) {
return a + b;
}
int main() {
std::cout << "suma " << suma(1, 2) << std::endl;
return 0;
}


4.cc:
#include <iostream>
class Suma {
public:
int suma(int a, int b) {
return a + b;
}
};
int main() {
Suma s;
std::cout << "suma " << s.suma(1, 2) << std::endl;
return 0;
}


# gcc -O2 -S 1.c
# g++ -O2 -S 2.cc
# g++ -O2 -S 3.cc
# g++ -O2 -S 4.cc

1.s: 660 bytes
2.s: 6446 bytes
3.s: 3038 bytes
4.s: 2688 bytes

¿Es suficiente o te hago un croquis?

(brants) Gonzalo R.G. dijo...

hum... no he hecho las pruebas de velocidad para poder rebatir tus experimentos... pero, bajo mi opinion, el peso del ejecutable no tiene nada que ver con su velocidad de ejecucion (Si no hay mucha diferencia de codigo).

Un mismo programa en C++(.net) y en C# producen diferente CLR, el de C# es muuucho mas extenso y por consiguiente pesa mas, y por raro que parezca C# se ejecuta mas rapido.

Cuando yo hago pruebas de velocidad sea con el lenguaje que sea, o por lo menos, cuando me enseñaron a hacerlas, se trataba de poner una var con el time actual.... y al final del codigo, hallar la diferencia respecto al time actual.... asi sacabas el tiempo en ms de ejecucion del programa.

Victor M. dijo...

Ya se que el peso del ejecutable no tiene porque indicar la velocidad de ejecución. Pero es una forma rápida (aunque chapucera) de comprobarlo siempre que se use el mismo compilador (es una chorrada comprobar así C++ con C#). Lo que quería dejar claro es que C++ añade una cantidad importante de sobrecarga que en C no se da.