De vez en cuando leo que Fortran es o puede ser más rápido que C para cálculos pesados. ¿Es eso realmente cierto? Debo admitir que apenas conozco a Fortran, pero el código de Fortran que he visto hasta ahora no muestra que el lenguaje tenga características que C no tiene.
Si es cierto, por favor dime por qué. Por favor, no me diga qué idiomas o libs son buenos para el cálculo de números, no tengo la intención de escribir una aplicación o lib para hacer eso, solo tengo curiosidad.
c
performance
fortran
quinmars
fuente
fuente
Respuestas:
Los idiomas tienen conjuntos de características similares. La diferencia de rendimiento proviene del hecho de que Fortran dice que el alias no está permitido, a menos que se use una declaración EQUIVALENCE. Cualquier código que tenga alias no es válido para Fortran, pero depende del programador y no del compilador detectar estos errores. Por lo tanto, los compiladores de Fortran ignoran el posible alias de los punteros de memoria y les permiten generar código más eficiente. Eche un vistazo a este pequeño ejemplo en C:
Esta función sería más lenta que la contraparte de Fortran después de la optimización. ¿Porque? Si escribe valores en la matriz de salida, puede cambiar los valores de la matriz. Después de todo, los punteros pueden superponerse y apuntar a la misma porción de memoria (¡incluido el
int
puntero!). El compilador de C se ve obligado a recargar los cuatro valores de la matriz desde la memoria para todos los cálculos.En Fortran, el compilador puede cargar los valores de la matriz una vez y almacenarlos en registros. Puede hacerlo porque el compilador Fortran supone que los punteros / matrices no se superponen en la memoria.
Afortunadamente, la
restrict
palabra clave y el alias estricto se han introducido en el estándar C99 para abordar este problema. También es compatible con la mayoría de los compiladores de C ++ en estos días. La palabra clave le permite dar al compilador una pista de que el programador promete que un puntero no se alias con ningún otro puntero. El medio-aliasing estrictas que las promesas programador que los punteros de diferente tipo nunca se superponen, por ejemplo, unadouble*
voluntad no se superponen con unaint*
(con la excepción específica quechar*
yvoid*
puede solaparse con cualquier cosa).Si los usas obtendrás la misma velocidad de C y Fortran. Sin embargo, la capacidad de usar la
restrict
palabra clave solo con funciones críticas de rendimiento significa que los programas C (y C ++) son mucho más seguros y fáciles de escribir. Por ejemplo, considere el código no válido de Fortran:CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)
que la mayoría de los compiladores de Fortran compilarán sin previo aviso, pero presenta un error que solo aparece en algunos compiladores, en algunos equipos y con algunas opciones de optimización.fuente
call transform
ejemplo no tiene mucho sentido.Si, en 1980; ¿en 2008? depende
Cuando comencé a programar profesionalmente, el dominio de la velocidad de Fortran estaba siendo desafiado. Recuerdo haber leído sobre esto en el Dr. Dobbs y contarles a los programadores mayores sobre el artículo, se rieron.
Así que tengo dos puntos de vista sobre esto, teórico y práctico. En teoría, Fortran hoy no tiene ninguna ventaja intrínseca para C / C ++ o incluso cualquier lenguaje que permita el código de ensamblaje. En la práctica, Fortran todavía disfruta de los beneficios del legado de una historia y una cultura basadas en la optimización del código numérico.
Hasta Fortran 77 inclusive, las consideraciones de diseño del lenguaje tenían la optimización como foco principal. Debido al estado de la teoría y la tecnología del compilador, esto a menudo significaba restringir las características y la capacidad para darle al compilador la mejor oportunidad de optimizar el código. Una buena analogía es pensar en Fortran 77 como un auto de carrera profesional que sacrifica características por la velocidad. En la actualidad, los compiladores han mejorado en todos los idiomas y las funciones para la productividad del programador son más valoradas. Sin embargo, todavía hay lugares donde las personas se preocupan principalmente por la velocidad en la informática científica; Es muy probable que estas personas hayan heredado el código, la capacitación y la cultura de personas que fueron programadores de Fortran.
Cuando uno comienza a hablar sobre la optimización del código, hay muchos problemas y la mejor manera de hacerse una idea es acechar dónde están las personas cuyo trabajo es tener un código numérico rápido . Pero tenga en cuenta que un código tan crítico suele ser una pequeña fracción de las líneas generales de código y muy especializado: una gran cantidad de código Fortran es tan "ineficiente" como muchos otros códigos en otros idiomas y la optimización ni siquiera debería ser Una preocupación principal de dicho código .
Un lugar maravilloso para comenzar a aprender sobre la historia y la cultura de Fortran es wikipedia. La entrada de Fortran Wikipedia es excelente y aprecio mucho a aquellos que se han tomado el tiempo y el esfuerzo para hacerla valiosa para la comunidad de Fortran.
(Una versión abreviada de esta respuesta habría sido un comentario en el excelente hilo iniciado por Nils, pero no tengo el karma para hacerlo. En realidad, probablemente no habría escrito nada en absoluto, pero para eso este hilo tiene real contenido de información y compartir en comparación con las guerras de llamas y la intolerancia lingüística, que es mi experiencia principal con este tema. Estaba abrumado y tuve que compartir el amor).
fuente
Hasta cierto punto, Fortran ha sido diseñado teniendo en cuenta la optimización del compilador. El lenguaje admite operaciones de matriz completa donde los compiladores pueden explotar el paralelismo (especialmente en procesadores multi-core). Por ejemplo,
La multiplicación de matriz densa es simplemente:
La norma L2 de un vector x es:
Por otra parte, como declaraciones
FORALL
,PURE
yELEMENTAL
procedimientos, etc. ayuda adicional al código optimizar. Incluso los punteros en Fortran no son tan flexibles como C debido a esta simple razón.El próximo estándar Fortran (2008) tiene matrices conjuntas que le permiten escribir fácilmente código paralelo. G95 (código abierto) y los compiladores de CRAY ya lo admiten.
Entonces sí, Fortran puede ser rápido simplemente porque los compiladores pueden optimizarlo / paralelizarlo mejor que C / C ++. Pero nuevamente, como todo lo demás en la vida, hay buenos compiladores y malos compiladores.
fuente
forall
construcción está en desuso porque los compiladores no pudieron optimizar bien el código. El reemplazo esdo concurrent
. Además, el códigosqrt(sum(x**2))
parece ineficiente, porque el compilador probablemente construye todo el vectorx**2
. Supongo que un bucle es mejor, pero sin duda es mejor llamar a lanorm2
función intrínseca .Es curioso que muchas respuestas aquí por no saber los idiomas. Esto es especialmente cierto para los programadores de C / C ++ que han abierto y antiguo código FORTRAN 77 y discuten las debilidades.
Supongo que el problema de la velocidad es principalmente una cuestión entre C / C ++ y Fortran. En un código enorme, siempre depende del programador. Hay algunas características del lenguaje que Fortran supera y algunas características que hace C. Entonces, en 2011, nadie puede decir cuál es más rápido.
Sobre el lenguaje en sí, Fortran hoy en día es compatible con las funciones Full OOP y es totalmente compatible con versiones anteriores. He usado el Fortran 2003 a fondo y diría que fue una delicia usarlo. En algunos aspectos, Fortran 2003 todavía está detrás de C ++, pero veamos el uso. Fortran se usa principalmente para la computación numérica, y nadie usa características sofisticadas de C ++ OOP por razones de velocidad. En informática de alto rendimiento, C ++ casi no tiene un lugar adonde ir (eche un vistazo al estándar MPI y verá que C ++ ha quedado en desuso).
Hoy en día, simplemente puede hacer programación de lenguaje mixto con Fortran y C / C ++. Incluso hay interfaces para GTK + en Fortran. Hay compiladores gratuitos (gfortran, g95) y muchos excelentes comerciales.
fuente
Hay varias razones por las que Fortran podría ser más rápido. Sin embargo, la cantidad que importan es tan intrascendente o puede evitarse de todos modos, por lo que no debería importar. La razón principal para usar Fortran hoy en día es mantener o ampliar las aplicaciones heredadas.
Palabras clave PURAS y ELEMENTALES en funciones. Estas son funciones que no tienen efectos secundarios. Esto permite optimizaciones en ciertos casos donde el compilador sabe que la misma función se llamará con los mismos valores. Nota: GCC implementa "puro" como una extensión del lenguaje. Otros compiladores también pueden hacerlo. El análisis entre módulos también puede realizar esta optimización, pero es difícil.
conjunto estándar de funciones que tratan con matrices, no elementos individuales. Cosas como sin (), log (), sqrt () toman matrices en lugar de escalares. Esto facilita la optimización de la rutina. La vectorización automática ofrece los mismos beneficios en la mayoría de los casos si estas funciones son en línea o incorporadas
Tipo complejo integrado. En teoría, esto podría permitir que el compilador reordene o elimine ciertas instrucciones en ciertos casos, pero es probable que vea el mismo beneficio con la estructura {double re, im; }; modismo utilizado en C. Sin embargo, permite un desarrollo más rápido ya que los operadores trabajan en tipos complejos en fortran.
fuente
{ double re, im; };
idiomática utilizada en C". Lo más probable es que los compiladores de C devuelvan esa estructura en forma sret con la pila de llamantes asignando espacio, pasando un puntero al destinatario que lo llena. Eso es varias veces más lento que devolver múltiples valores en los registros como lo haría un compilador de Fortran. Tenga en cuenta que C99 solucionó esto en el caso especial de complejo.Creo que el punto clave a favor de Fortran es que es un lenguaje un poco más adecuado para expresar matemáticas basadas en vectores y matrices. El problema del análisis de puntero señalado anteriormente es real en la práctica, ya que el código portátil realmente no puede suponer que puede decirle algo a un compilador. SIEMPRE hay una ventaja para los cálculos de expresión de una manera más cercana a la apariencia del dominio. C realmente no tiene matrices en absoluto, si nos fijamos bien, solo algo que se comporta de esa manera. Fortran tiene arrawys reales. Lo que facilita la compilación de ciertos tipos de algoritmos, especialmente para máquinas paralelas.
En lo profundo de cosas como el sistema de tiempo de ejecución y las convenciones de llamadas, C y Fortran moderno son lo suficientemente similares como para que sea difícil ver qué marcaría la diferencia. Tenga en cuenta que C aquí es realmente base C: C ++ es un problema totalmente diferente con características de rendimiento muy diferentes.
fuente
No existe un idioma que sea más rápido que otro, por lo que la respuesta correcta es no .
Lo que realmente debe preguntar es "¿el código se compila con el compilador Fortran X más rápido que el código equivalente compilado con el compilador C Y?" La respuesta a esa pregunta, por supuesto, depende de los dos compiladores que elija.
Otra pregunta que uno podría hacer sería la siguiente: "Dado el mismo esfuerzo realizado para optimizar en sus compiladores, ¿qué compilador produciría un código más rápido?" La respuesta a esto sería, de hecho, Fortran . Los compiladores de Fortran tienen ventajas certianas:
Sin embargo, no hay nada que impida que alguien ponga un montón de esfuerzo en la optimización de su compilador C, y que genere un código mejor que el compilador Fortran de su plataforma. De hecho, las mayores ventas generadas por los compiladores de C hacen que este escenario sea bastante factible.
fuente
Hay otro elemento en el que Fortran es diferente de C, y potencialmente más rápido. Fortran tiene mejores reglas de optimización que C. En Fortran, el orden de evaluación de una expresión no está definido, lo que permite que el compilador lo optimice; si uno quiere forzar un cierto orden, debe usar paréntesis. En C el orden es mucho más estricto, pero con las opciones "rápidas", son más relajadas y "(...)" también se ignoran. Creo que Fortran tiene un camino que se encuentra muy bien en el medio. (Bueno, IEEE hace que la vida sea más difícil ya que ciertos cambios en el orden de evaluación requieren que no ocurran desbordamientos, lo que debe ignorarse o obstaculizar la evaluación).
Otra área de reglas más inteligentes son los números complejos. No solo eso tomó hasta C 99 que C los tenía, sino que también las reglas que los gobiernan son mejores en Fortran; Como la biblioteca Fortran de gfortran está parcialmente escrita en C pero implementa la semántica de Fortran, GCC obtuvo la opción (que también se puede usar con programas C "normales"):
Las reglas de alias mencionadas anteriormente son otro bono y también, al menos en principio, las operaciones de matriz completa, que si el optimizador del compilador las tiene en cuenta adecuadamente, pueden generar un código más rápido. Por el contrario, ciertas operaciones llevan más tiempo, por ejemplo, si se realiza una asignación a una matriz asignable, hay muchas comprobaciones necesarias (¿reasignar? [Función Fortran 2003], tiene los pasos de la matriz, etc.), que hacen que operación simple más compleja detrás de escena, y por lo tanto más lenta, pero hace que el lenguaje sea más poderoso. Por otro lado, las operaciones de matriz con límites y pasos flexibles hacen que sea más fácil escribir código, y el compilador generalmente optimiza mejor el código que un usuario.
En total, creo que tanto C como Fortran son casi igualmente rápidos; la elección debería ser más qué idioma le gusta más o si usar las operaciones de matriz completa de Fortran y su mejor portabilidad son más útiles, o la mejor interfaz con el sistema y las bibliotecas de interfaz gráfica de usuario en C.
fuente
No hay nada acerca de los lenguajes Fortran y C que hace que uno sea más rápido que el otro para fines específicos. Hay cosas sobre compiladores específicos para cada uno de estos idiomas que hacen que algunos sean más favorables para ciertas tareas que otros.
Durante muchos años, existieron los compiladores de Fortran que podían hacer magia negra en sus rutinas numéricas, haciendo muchos cálculos importantes increíblemente rápidos. Los compiladores de C contemporáneos no podían hacerlo también. Como resultado, varias grandes bibliotecas de código crecieron en Fortran. Si desea utilizar estas bibliotecas bien probadas, maduras y maravillosas, rompa el compilador Fortran.
Mis observaciones informales muestran que en estos días la gente codifica sus pesadas tareas informáticas en cualquier idioma antiguo y, si les lleva un tiempo, encuentran tiempo en algún grupo de computadoras barato. La Ley de Moore nos hace tontos a todos.
fuente
Comparo la velocidad de Fortran, C y C ++ con el clásico punto de referencia Levine-Callahan-Dongarra de netlib. La versión en varios idiomas, con OpenMP, es http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors. El C es más feo, ya que comenzó con la traducción automática, además de la inserción de restricciones y pragmas para ciertos compiladores C ++ es solo C con plantillas STL cuando corresponde. Desde mi punto de vista, el STL es una combinación de si mejora la mantenibilidad.
Solo existe un ejercicio mínimo de la función automática en línea para ver en qué medida mejora la optimización, ya que los ejemplos se basan en la práctica tradicional de Fortran, donde se confía poco en la línea.
El compilador C / C ++ que tiene, con mucho, el uso más extendido carece de auto-vectorización, de la cual estos puntos de referencia dependen en gran medida.
Vuelva a la publicación que vino justo antes de esto: hay un par de ejemplos en los que se usan paréntesis en Fortran para dictar el orden de evaluación más rápido o más preciso. Los compiladores de C conocidos no tienen opciones para observar los paréntesis sin deshabilitar optimizaciones más importantes.
fuente
Soy un programador aficionado y soy "promedio" en ambos idiomas. Me resulta más fácil escribir código Fortran rápido que el código C (o C ++). Tanto Fortran como C son lenguajes "históricos" (según el estándar actual), son muy utilizados y tienen un compilador gratuito y comercial bien soportado.
No sé si es un hecho histórico, pero Fortran siente que está construido para ser paralelo / distribuido / vectorizado / lo que sea muchos núcleos. Y hoy es más o menos la "métrica estándar" cuando hablamos de velocidad: "¿escala?"
Para el crujido de CPU puro, me encanta Fortran. Para cualquier cosa relacionada con IO, me resulta más fácil trabajar con C. (de todos modos, es difícil en ambos casos).
Ahora, por supuesto, para el código de uso intensivo de matemáticas en paralelo, probablemente quiera usar su GPU. Tanto C como Fortran tienen una interfaz CUDA / OpenCL más o menos bien integrada (y ahora OpenACC).
Mi respuesta moderadamente objetiva es: si conoces ambos idiomas igualmente bien / mal, entonces creo que Fortran es más rápido porque me resulta más fácil escribir código paralelo / distribuido en Fortran que C. (una vez que entiendes que puedes escribir fortran "forma libre" y no solo el estricto código F77)
Aquí hay una segunda respuesta para aquellos que deseen denunciarme porque no les gusta la primera respuesta: ambos idiomas tienen las características necesarias para escribir código de alto rendimiento. Por lo tanto, depende del algoritmo que esté implementando (¿CPU intensiva? ¿Intensiva? ¿Intensiva en memoria?), El hardware (¿CPU única? ¿Multinúcleo? Tanto C como Fortran tienen un increíble compilador. (Estoy realmente sorprendido por lo avanzados que son los compiladores de Fortran, pero también lo son los compiladores de C).
PD: me alegra que hayas excluido específicamente las bibliotecas porque tengo muchas cosas malas que decir sobre las bibliotecas GUI de Fortran. :)
fuente
Estuve haciendo algunas matemáticas extensas con FORTRAN y C durante un par de años. Según mi propia experiencia, puedo decir que FORTRAN a veces es realmente mejor que C, pero no por su velocidad (se puede hacer que C funcione tan rápido como FORTRAN usando el estilo de codificación apropiado) sino por bibliotecas muy bien optimizadas como LAPACK, y por Gran paralelización. En mi opinión, es muy difícil trabajar con FORTRAN, y sus ventajas no son lo suficientemente buenas como para cancelar ese inconveniente, por lo que ahora estoy usando C + GSL para hacer cálculos.
fuente
Cualquier diferencia de velocidad entre Fortran y C será más una función de las optimizaciones del compilador y la biblioteca matemática subyacente utilizada por el compilador particular. No hay nada intrínseco en Fortran que lo haga más rápido que C.
De todos modos, un buen programador puede escribir Fortran en cualquier idioma.
fuente
No he escuchado que Fortan es significativamente más rápido que C, pero podría ser concebible que en ciertos casos sería más rápido. Y la clave no está en las características del lenguaje que están presentes, sino en aquellas que (generalmente) están ausentes.
Un ejemplo son los punteros en C. Los punteros en C se usan prácticamente en todas partes, pero el problema con los punteros es que el compilador generalmente no puede saber si apuntan a las diferentes partes de la misma matriz.
Por ejemplo, si escribió una rutina estricta que se parece a esto:
El compilador tiene que funcionar bajo el supuesto de que d y s podrían estar superpuestos a las matrices. Por lo tanto, no puede realizar una optimización que produzca resultados diferentes cuando las matrices se superponen. Como era de esperar, esto restringe considerablemente el tipo de optimizaciones que se pueden realizar.
[Debo señalar que C99 tiene una palabra clave "restringir" que explícitamente le dice a los compiladores que los punteros no se superponen. También tenga en cuenta que el Fortran también tiene punteros, con semánticas diferentes de las de C, pero los punteros no son ubicuos como en C.]
Pero volviendo al tema C vs.Fortran, es concebible que un compilador Fortran sea capaz de realizar algunas optimizaciones que podrían no ser posibles para un programa C (escrito directamente). Así que no me sorprendería demasiado el reclamo. Sin embargo, espero que la diferencia de rendimiento no sea tanto. [~ 5-10%]
fuente
Rápido y simple: Ambos son igualmente rápidos, pero Fortran es más simple. Lo que es realmente más rápido al final depende del algoritmo, pero de todos modos no hay una diferencia de velocidad considerable. Esto es lo que aprendí en un taller de Fortran en el centro de informática de alto rendimiento Stuttgard, Alemania, en 2015. Trabajo con Fortran y C y comparto esta opinión.
Explicación:
C fue diseñado para escribir sistemas operativos. Por lo tanto, tiene más libertad de la necesaria para escribir código de alto rendimiento. En general, esto no es un problema, pero si uno no programa con cuidado, puede ralentizar fácilmente el código.
Fortran fue diseñado para la programación científica. Por esta razón, es compatible con la escritura rápida de sintaxis de código, ya que este es el propósito principal de Fortran. A diferencia de la opinión pública, Fortran no es un lenguaje de programación obsoleto. Su último estándar es 2010 y los nuevos compiladores se publican regularmente, ya que la mayoría del código de alto rendimiento está escrito en Fortran. Fortran admite además funciones modernas como directivas de compilación (en pragmas C).
Ejemplo: Queremos dar una estructura grande como argumento de entrada a una función (fortran: subrutina). Dentro de la función, el argumento no se altera.
C admite ambos, llamada por referencia y llamada por valor, que es una característica útil. En nuestro caso, el programador podría usar accidentalmente la llamada por valor. Esto ralentiza las cosas considerablemente, ya que la estructura debe copiarse primero en la memoria.
Fortran trabaja solo con llamada por referencia, lo que obliga al programador a copiar la estructura a mano, si realmente quiere una operación de llamada por valor. En nuestro caso, fortran será automáticamente tan rápido como la versión C con llamada por referencia.
fuente
En general, FORTRAN es más lento que C. C puede usar punteros de nivel de hardware que permiten al programador optimizar a mano. FORTRAN (en la mayoría de los casos) no tiene acceso a hacks de direccionamiento de memoria de hardware. (VAX FORTRAN es otra historia). He usado FORTRAN de vez en cuando desde los años 70. (De Verdad.)
Sin embargo, a partir de los años 90, FORTRAN ha evolucionado para incluir construcciones de lenguaje específicas que pueden optimizarse en algoritmos inherentemente paralelos que realmente pueden gritar en un procesador multinúcleo. Por ejemplo, la vectorización automática permite que múltiples procesadores manejen cada elemento en un vector de datos simultáneamente. 16 procesadores - vector de 16 elementos - el procesamiento tarda 1/16 del tiempo.
En C, debe administrar sus propios subprocesos y diseñar su algoritmo con cuidado para el procesamiento múltiple, y luego usar un montón de llamadas API para asegurarse de que el paralelismo ocurra correctamente.
En FORTRAN, solo tiene que diseñar su algoritmo cuidadosamente para el procesamiento múltiple. El compilador y el tiempo de ejecución pueden manejar el resto por usted.
Puedes leer un poco sobre High Performance Fortran , pero encontrarás muchos enlaces muertos. Es mejor leer acerca de la programación paralela (como OpenMP.org ) y cómo FORTRAN lo admite.
fuente
El código más rápido no está realmente a la altura del lenguaje, es el compilador para que pueda ver el "compilador" ms-vb que genera un código de objeto hinchado, más lento y redundante que está unido dentro de un ".exe", pero powerBasic genera demasiado mejor código El código objeto creado por un compilador C y C ++ se genera en algunas fases (al menos 2), pero por diseño, la mayoría de los compiladores Fortran tienen al menos 5 fases, incluidas optimizaciones de alto nivel, por lo que Fortran siempre tendrá la capacidad de generar código altamente optimizado. Entonces, al final, el compilador no es el idioma que debe pedir, el mejor compilador que conozco es el compilador Intel Fortran porque puede obtenerlo en LINUX y Windows y puede usar VS como IDE, si está buscando un compilador tigh barato que siempre puede transmitir en OpenWatcom.
Más información sobre esto: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html
fuente
Fortran tiene mejores rutinas de E / S, por ejemplo, la función implícita do brinda flexibilidad que la biblioteca estándar de C no puede igualar.
El compilador Fortran maneja directamente la sintaxis más compleja involucrada, y como tal sintaxis no se puede reducir fácilmente a la forma de pasar argumentos, C no puede implementarla de manera eficiente.
fuente
Usando estándares modernos y compilador, ¡no!
Algunas de las personas aquí han sugerido que FORTRAN es más rápido porque el compilador no necesita preocuparse por el alias (y, por lo tanto, puede hacer más suposiciones durante la optimización). Sin embargo, esto se ha tratado en C desde el estándar C99 (creo) con la inclusión de la palabra clave restrict. Lo que básicamente le dice al compilador, que dentro de un ámbito dado, el puntero no tiene alias. Además, C permite una aritmética de puntero adecuada, donde cosas como el alias pueden ser muy útiles en términos de rendimiento y asignación de recursos. Aunque creo que la versión más reciente de FORTRAN permite el uso de punteros "adecuados".
Para implementaciones modernas, C general supera a FORTRAN (aunque también es muy rápido).
http://benchmarksgame.alioth.debian.org/u64q/fortran.html
EDITAR:
Una crítica justa de esto parece ser que la evaluación comparativa puede estar sesgada. Aquí hay otra fuente (relativa a C) que pone el resultado en más contexto:
http://julialang.org/benchmarks/
Puede ver que C generalmente supera a Fortran en la mayoría de los casos (nuevamente vea las críticas a continuación que también se aplican aquí); Como han dicho otros, la evaluación comparativa es una ciencia inexacta que se puede cargar fácilmente para favorecer un idioma sobre otros. Pero sí pone en contexto cómo Fortran y C tienen un rendimiento similar.
fuente
Fortran puede manejar la matriz, especialmente las matrices multidimensionales, de manera muy conveniente. Cortar elementos de una matriz multidimensional en Fortran puede ser mucho más fácil que eso en C / C ++. C ++ ahora tiene bibliotecas que pueden hacer el trabajo, como Boost o Eigen, pero están detrás de todas las bibliotecas externas. En Fortran estas funciones son intrínsecas.
Que Fortran sea más rápido o más conveniente para el desarrollo depende en gran medida del trabajo que necesita terminar. Como persona de computación científica para geofísica, hice la mayor parte de la computación en Fortran (me refiero a Fortran moderno,> = F90).
fuente
Esto es más que algo subjetivo, porque entra en la calidad de los compiladores y más que cualquier otra cosa. Sin embargo, para responder más directamente a su pregunta, hablando desde el punto de vista del lenguaje / compilador, no hay nada sobre Fortran sobre C que lo haga inherentemente más rápido o mejor que C. Si está haciendo operaciones matemáticas pesadas, todo se reducirá a la calidad del compilador, la habilidad del programador en cada lenguaje y las bibliotecas de soporte matemático intrínseco que soportan esas operaciones para determinar cuál será más rápido para una implementación dada.
EDITAR: Otras personas como @Nils han planteado el buen punto sobre la diferencia en el uso de punteros en C y la posibilidad de alias que tal vez hace que las implementaciones más ingenuas sean más lentas en C. Sin embargo, hay formas de lidiar con eso en C99 , mediante indicadores de optimización del compilador y / o cómo se escribe realmente el C. Esto está bien cubierto en @Nils answer y los comentarios posteriores que siguen a su respuesta.
fuente
La mayoría de las publicaciones ya presentan argumentos convincentes, por lo que solo agregaré los proverbiales 2 centavos a un aspecto diferente.
Ser fortran más rápido o más lento en términos de poder de procesamiento al final puede tener su importancia, pero si lleva 5 veces más tiempo desarrollar algo en Fortran porque:
Entonces el problema es irrelevante. Si algo es lento, la mayoría de las veces no puede mejorarlo más allá de un límite determinado. Si quieres algo más rápido, cambia el algoritmo. Al final, el tiempo de la computadora es barato. El tiempo humano no lo es. Valorar la elección que reduce el tiempo humano. Si aumenta el tiempo de la computadora, es rentable de todos modos.
fuente
I will just add the proverbial 2 cents to a different aspect
Fortran tradicionalmente no establece opciones como -fp: estricto (que ifort requiere para habilitar algunas de las características en USE IEEE_arithmetic, una parte del estándar f2003). Intel C ++ tampoco establece -fp: estricto por defecto, pero eso es necesario para el manejo de ERRNO, por ejemplo, y otros compiladores de C ++ no hacen que sea conveniente apagar ERRNO u obtener optimizaciones como la reducción de simd. gcc y g ++ me han requerido configurar Makefile para evitar usar la combinación peligrosa -O3 -ffast-math -fopenmp -march = native. Además de estos problemas, esta pregunta sobre el rendimiento relativo se vuelve más exigente y dependiente de las reglas locales sobre la elección de compiladores y opciones.
fuente