Hasta donde yo entiendo, todos los lenguajes de scripting y los programas científicos básicos generalmente se escriben en C; esto hace que la implementación sea complicada pero de una manera directa al grano.
Entiendo que a estas personas les gustaría maximizar su rendimiento, pero ¿hay una diferencia real entre usar cadenas C y estructuras C y usar clases C ++? C ++ parece funcionar de la misma manera, aparte de las funciones virtuales, almacena una función de clase una vez y cada instancia de esa clase llama a esa función.
¿Qué hace que C sea más rápido y es una diferencia notable en un proyecto como python o sqlite que tienen que ser los más rápidos?
c++
c
performance
Will03uk
fuente
fuente
Respuestas:
C ++ se usa a menudo para programas científicos. La popularidad de C puede estar disminuyendo en ese dominio. Fortran sigue siendo popular como lenguaje de "bajo nivel".
En C ++, "solo paga por lo que usa". Así que no hay nada que lo haga más lento que C. En particular para los programas científicos, las plantillas de expresión permiten realizar algunas optimizaciones personalizadas utilizando el motor de plantillas para procesar la semántica del programa.
La razón por la que se elige C para proyectos como Python es que muchas personas lo entienden (relativamente) completamente, por lo que una gran base de código no confundirá a muchos de los muchos colaboradores.
SQLite tiene un requisito para un tamaño de código ejecutable pequeño, donde C tiene una ligera ventaja. El uso sensato de C ++ aún permite su uso en aplicaciones integradas, pero es menos popular debido al temor de que aparezcan características de lenguaje no deseadas.
fuente
extern "C"
. Swig usa C como lengua franca, pero podría implementar ese contenedor dentro del subconjunto compatible con C de C ++ y nunca invocar un compilador de C.No creo que la razón esté tanto relacionada con el rendimiento como con la interoperabilidad. El lenguaje C ++ es más complejo que el lenguaje C, pero desde el punto de vista del rendimiento no debería haber una diferencia notable de ninguna manera. Algunas construcciones de C ++ son más rápidas que el equivalente de C (
std::sort
es más rápido queqsort
) y probablemente haya buenos ejemplos al revés.EDITAR: En el lado de la interoperabilidad ...
Básicamente, el estándar C ++ no define algunas de las cosas que podrían ser necesarias para una fácil interoperabilidad entre binarios creados con diferentes compiladores / versiones. El problema más notable aquí sería la convención de nomenclatura para los símbolos en el binario. En C, el lenguaje define una sola asignación de cada símbolo en código al nombre del símbolo binario. Una función llamada
my_function
creará un símbolo en el binario llamadomy_function
. Por otro lado, y debido a características como la sobrecarga de funciones, los nombres de las funciones de C ++ deben ser mutilados(traducido a diferentes símbolos de función en el binario, codificando los tipos de argumentos y tipos de retorno), y el estándar no define cómo se realiza la alteración. Eso, a su vez, significa que la misma función en C ++ se puede compilar en diferentes símbolos según el compilador (a menos queextern "C"
se use para forzar la interoperabilidad de C para esas funciones en C ++).Al final del día, la interfaz entre el lenguaje de programación y el código nativo tendría que ser una interfaz C de todos modos, incluso si los detalles de cómo se implementa internamente podrían ser C / C ++ / cualquier otro idioma nativo.
(Intencionalmente no quiero entrar en una guerra de pretensiones lingüísticas, C ++ es realmente poderoso, pero también da un poco de miedo ya que es un lenguaje mucho más complejo que C, y algunas cosas que parecen simples pueden tener un impacto en actuación)
fuente
std::sort
es uno de esos ejemplos: elstd::less
functor usado por defecto no es menos eficiente que la función C equivalente, pero todos los compiladores que conozco lo integrarán (siendo una plantilla, está disponible para la inserción) y eliminarán todas las llamadas de función alcompare
functor.Como mencionó Bjarne en [D&E], la efectividad es uno de los principales objetivos de C ++. Entonces C ++ es más lento solo cuando el programador usa sus funciones "adicionales" como las funciones virtuales que mencionaste, información rtt, etc.
Así que creo que es más por razones psicológicas: se usa C porque no permite funciones de C ++ "lentas".
fuente
Los lenguajes no son intrínsecamente más rápidos o más lentos, los intérpretes y compiladores pueden ser más o menos eficientes.
Además de eso, los lenguajes de nivel superior proporcionan capas de abstracción que generalmente tienen un costo de tiempo de ejecución. Si no los está usando, el compilador podría ser lo suficientemente inteligente como para eliminarlos, pero eso podría no ser posible si la semántica del lenguaje no permite hacerlo de manera segura ... Y si los necesita, impleméntelos usted mismo en un idioma de nivel inferior probablemente será más lento que usar el idioma "lento".
fuente
restrict
palabra clave en C o luajit: este último no elimina a todos los demás vm para lenguajes dinámicos solo porque Mike es un tipo inteligente, sino también porque la semántica de Lua es bastante limpia (en comparación con, por ejemplo, JavaScript)