tecnicas site realizarse page optimizacion off hacer google definición define debe como auditoria antes c performance fortran

site - ¿Fortran es más fácil de optimizar que C para cálculos pesados?



seo off page definición (23)

Sí, en 1980; ¿en 2008? depende

Cuando comencé a programar profesionalmente, el dominio de la velocidad de Fortran estaba siendo desafiado. Recuerdo que lo leí en el Dr. Dobbs y le conté a los programadores más antiguos sobre el artículo, se rieron.

Así que tengo dos puntos de vista sobre esto, teórico y práctico. En teoría, hoy en día, Fortran no tiene una ventaja intrínseca para C / C ++ o incluso cualquier lenguaje que permita el código de ensamblaje. En la práctica, hoy en día, Fortran todavía disfruta de los beneficios del legado de una historia y cultura basadas en la optimización del código numérico.

Hasta e incluyendo Fortran 77, las consideraciones de diseño del idioma tenían la optimización como un enfoque principal. Debido al estado de la teoría y la tecnología del compilador, esto a menudo significaba restringir las funciones y la capacidad para dar al compilador la mejor oportunidad de optimizar el código. Una buena analogía es pensar en Fortran 77 como un auto de carreras profesional que sacrifica funciones por velocidad. En estos días, los compiladores han mejorado en todos los idiomas y las características para la productividad del programador son más valoradas. Sin embargo, todavía hay lugares donde las personas están preocupadas principalmente por la velocidad en la computación científica; estas personas probablemente han heredado el código, la capacitación y la cultura de personas que ellos mismos eran programadores de Fortran.

Cuando uno comienza a hablar sobre la optimización del código, hay muchos problemas y la mejor manera de tener una idea de esto es acechar dónde están las personas cuyo trabajo es tener un código numérico rápido . Pero tenga en cuenta que este código tan crítico es generalmente una pequeña fracción de las líneas generales de código y es muy especializado: una gran cantidad de código Fortran es tan "ineficiente" como una gran cantidad de otros códigos en otros idiomas y la optimización no debería ser una preocupación primordial de dicho código .

Un maravilloso lugar para comenzar a aprender sobre la historia y la cultura de Fortran es la wikipedia. La entrada de la Wikipedia de Fortran es excelente y aprecio mucho a aquellos que se han tomado el tiempo y el esfuerzo para hacer que sea de valor para la comunidad de Fortran.

(Una versión abreviada de esta respuesta hubiera sido un comentario en el excelente hilo iniciado por Nils, pero no tengo el karma para hacer eso. En realidad, probablemente no hubiera escrito nada en absoluto, pero para eso este hilo tiene un significado real. El contenido de la información y el intercambio a diferencia de las guerras de fuego y el fanatismo lingüístico, que es mi experiencia principal con este tema. Estaba abrumado y tuve que compartir el amor.)

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 Fortran, pero el código de Fortran que he visto hasta ahora no muestra que el lenguaje tenga características que C no tenga.

Si es verdad, por favor dime por qué. Por favor, no me diga qué idiomas o libretas son buenos para hacer cálculos numéricos, no tengo la intención de escribir una aplicación o libreta para hacerlo, solo tengo curiosidad.


Comparo la velocidad de Fortran, C y C ++ con el clásico de referencia Levine-Callahan-Dongarra de netlib. La versión en múltiples idiomas, con OpenMP, es http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors La C es más fea, ya que comenzó con la traducción automática, más la inserción de restricciones y pragmas para ciertos compiladores C ++ es solo C con plantillas STL donde corresponda. En mi opinión, el STL es una bolsa mixta en cuanto a si mejora la capacidad de mantenimiento.

Solo hay un ejercicio mínimo de la función de alineación automática para ver hasta qué punto mejora la optimización, ya que los ejemplos se basan en la práctica tradicional de Fortran, en la que se confía poco en la alineación.

El compilador C / C ++ que tiene el uso más extendido con diferencia carece de auto-vectorización, en el cual estos puntos de referencia se basan en gran medida.

Refiérase a la publicación que apareció justo antes de esto: hay un par de ejemplos en los que se utilizan 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.


Creo que el punto clave a favor de Fortran es que es un lenguaje ligeramente más adecuado para expresar matemáticas basadas en vectores y matrices. El problema del análisis del puntero señalado anteriormente es real en la práctica, ya que el código portátil no puede realmente suponer que se puede decir algo al compilador. SIEMPRE hay una ventaja en las expresiones de cómputo de una manera más cercana a cómo se ve el dominio. C realmente no tiene matrices, si se mira bien, solo se comporta algo así. 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 básico C: C ++ es un problema totalmente diferente con características de rendimiento muy diferentes.


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 en particular. No hay nada intrínseco en Fortran que lo haría más rápido que C.

De todos modos, un buen programador puede escribir Fortran en cualquier idioma.


Durante un par de años estuve estudiando matemática extensiva con FORTRAN y C. Por mi propia experiencia, puedo decir que FORTRAN es a veces realmente mejor que C, pero no por su velocidad (uno puede hacer que C se desempeñe tan rápido como FORTRAN utilizando el estilo de codificación apropiado), sino más bien por bibliotecas muy bien optimizadas como LAPACK, y debido a Gran paralelización. En mi opinión, trabajar con FORTRAN es realmente incómodo y sus ventajas no son suficientes para cancelar ese inconveniente, por lo que ahora estoy usando C + GSL para hacer cálculos.


Es curioso que haya muchas respuestas aquí por no saber los idiomas. Esto es especialmente cierto para los programadores de C / C ++ que han abierto un código antiguo de FORTRAN 77 y discuten las debilidades.

Supongo que el problema de la velocidad es principalmente una pregunta 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 C hace. 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 características de OOP completo y es totalmente compatible con versiones anteriores. He usado el Fortran 2003 a fondo y diría que fue un placer 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 las funciones de OOP de C ++ debido a razones de velocidad. En computación de alto rendimiento, C ++ casi no tiene a dónde 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 en varios idiomas con Fortran y C / C ++. Incluso hay interfaces para GTK + en Fortran. Hay compiladores gratuitos (gfortran, g95) y muchos excelentes comerciales.


Generalmente, FORTRAN es más lento que C. C puede usar punteros de nivel de hardware que permiten al programador optimizar manualmente. FORTRAN (en la mayoría de los casos) no tiene acceso a la memoria de hardware que trata los hacks.(VAX FORTRAN es otra historia). He usado FORTRAN de forma intermitente 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 de varios núcleos. Por ejemplo, la Vectorización automática permite que múltiples procesadores manejen cada elemento en un vector de datos al mismo tiempo. 16 procesadores - vector de 16 elementos - el procesamiento toma 1/16 del tiempo.

En C, debe administrar sus propios subprocesos y diseñar su algoritmo cuidadosamente para el multiprocesamiento, y luego usar un montón de llamadas a la API para asegurarse de que el paralelismo se realice correctamente.

En FORTRAN, solo tiene que diseñar su algoritmo cuidadosamente para multiprocesamiento. El compilador y el tiempo de ejecución pueden manejar el resto por ti.

Puedes leer un poco sobre High Performance Fortran , pero encuentras muchos enlaces muertos. Es mejor que lea sobre Programación paralela (como OpenMP.org ) y sobre cómo FORTRAN lo admite.


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 de múltiples núcleos). Por ejemplo,

La multiplicación de matrices densas es simplemente:

matmul(a,b)

La norma L2 de un vector x es:

sqrt(sum(x**2))

Además, las declaraciones como los procedimientos FORALL , PURE y ELEMENTAL , etc. ayudan a optimizar el código. Incluso los indicadores en Fortran no son tan flexibles como C debido a esta sencilla razón.

El próximo estándar de Fortran (2008) tiene co-matrices que le permiten escribir fácilmente código paralelo. G95 (fuente abierta) y compiladores de CRAY ya lo soportan.

Entonces, sí, Fortran puede ser rápido simplemente porque los compiladores pueden optimizarlo / paralelizarlo mejor que C / C ++. Pero una vez más, como todo lo demás en la vida, hay buenos compiladores y malos compiladores.


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 le permite al compilador optimizarlo: si uno quiere forzar un cierto orden, tiene que usar paréntesis. En C, el orden es mucho más estricto, pero con las opciones "-fast", están más relajados y también se ignora "(...)". Creo que Fortran tiene un camino que está muy bien en el medio. (Bueno, IEEE dificulta la vida ya que ciertos cambios de orden de evaluación requieren que no se produzcan desbordamientos, lo que debe ignorarse o dificultar la evaluación).

Otra área de reglas más inteligentes son los números complejos. No solo tomaron hasta C 99 que C los tenía, sino que también las reglas que los gobiernan son mejores en Fortran; dado que 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"):

-fcx-fortran-rules La multiplicación y división complejas siguen las reglas de Fortran. La reducción del rango se realiza como parte de la división compleja, pero no se verifica si el resultado de una multiplicación o división compleja es "NaN + I * NaN", con un intento de rescatar la situación en ese caso.

Las reglas de alias mencionadas anteriormente son otra ventaja y también, al menos en principio, las operaciones de toda la matriz, que si se toman en cuenta adecuadamente por el optimizador del compilador, pueden llevar a un código más rápido. En el lado contrario, hay ciertas operaciones que requieren más tiempo, por ejemplo, si se realiza una asignación a una matriz asignable, hay muchas comprobaciones necesarias (¿reasignar? [Característica de 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 facilitan la escritura de código, y el compilador generalmente optimiza mejor el código que un usuario.

En total, creo que tanto C como Fortran son igualmente rápidos; la elección debería ser más, qué lenguaje le gusta más o si usar las operaciones de todo el conjunto de Fortran y su mejor portabilidad son más útiles, o la mejor interfaz con las bibliotecas del sistema y de la interfaz gráfica de usuario en C.


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 ser manejada de todas formas, que no debería importar. La razón principal para usar Fortran hoy en día es mantener o extender las aplicaciones heredadas.

  • Palabras clave puras y elementales en las 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 pueden también. El análisis entre módulos también puede realizar esta optimización, pero es difícil.

  • Conjunto estándar de funciones que se ocupan de matrices, no elementos individuales. Cosas como sin (), log (), sqrt () toman matrices en lugar de escalar. 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 están en línea o incorporadas

  • Tipo complejo incorporado. 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; }; el idioma utilizado en C. Hace que el desarrollo sea más rápido, aunque los operadores trabajan en tipos complejos en Fortran.


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 un 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 aliasing de los punteros de memoria y les permiten generar código más eficiente. Echa un vistazo a este pequeño ejemplo en C:

void transform (float *output, float const * input, float const * matrix, int *n) { int i; for (i=0; i<*n; i++) { float x = input[i*2+0]; float y = input[i*2+1]; output[i*2+0] = matrix[0] * x + matrix[1] * y; output[i*2+1] = matrix[2] * x + matrix[3] * y; } }

Esta función se ejecutaría más lentamente 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 podrían superponerse y apuntar a la misma parte de la memoria (incluido el puntero int ). El compilador de C está obligado a volver a cargar los cuatro valores de matriz de 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 palabra clave restringir y el aliasing estricto se han introducido en el estándar C99 para solucionar este problema. También está bien soportado en 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 hace alias con ningún otro puntero. El alias estricto significa que el programador promete que los punteros de diferente tipo nunca se superpondrán, por ejemplo, un double* no se superpondrá con un int* (con la excepción específica de que char* y void* pueden superponerse con cualquier cosa).

Si los usas obtendrás la misma velocidad de C y Fortran. Sin embargo, la capacidad de utilizar la palabra clave restringir 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 de Fortran no válido: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30) , que la mayoría de los compiladores de Fortran compilarán sin ningún aviso pero introducen un error. eso solo aparece en algunos compiladores, en algunos hardware y con algunas opciones de optimización.


No existe un idioma que sea más rápido que otro, por lo que la respuesta correcta es no .

Lo que realmente debes preguntar es "¿el código compilado con el compilador X de Fortran es más rápido que el código equivalente compilado con el compilador C de C?" La respuesta a esa pregunta, por supuesto, depende de los dos compiladores que elija.

Otra pregunta que se podría hacer sería la siguiente: "Dada la misma cantidad de esfuerzo para optimizar sus compiladores, ¿qué compilador producirá un código más rápido?" La respuesta a esto sería, de hecho, Fortran . Los compiladores de Fortran tienen ventajas certian:

  • Fortran tuvo que competir con Assembly en el día en que algunos prometieron nunca usar compiladores, por lo que fue diseñado para la velocidad. C fue diseñado para ser flexible.
  • El nicho de Fortran ha sido el número crujido. En este código de dominio nunca es lo suficientemente rápido. Así que siempre ha habido mucha presión para mantener el lenguaje eficiente.
  • La mayoría de las investigaciones sobre optimizaciones de compiladores las realizan personas interesadas en acelerar el código de cálculo de números de Fortran, por lo que la optimización del código de Fortran es un problema mucho más conocido que la optimización de cualquier otro lenguaje compilado, y las innovaciones aparecen primero en los compiladores de Fortran.
  • Biggie : C fomenta mucho más uso de punteros que Fortran. Esto aumenta drásticamente el alcance potencial de cualquier elemento de datos en un programa C, lo que los hace mucho más difíciles de optimizar. Tenga en cuenta que Ada también es mucho mejor que C en este ámbito, y es un lenguaje OO mucho más moderno que el Fortran77 que se encuentra comúnmente. Si desea un lenguaje OO que pueda generar un código más rápido que C, esta es una opción para usted.
  • Debido de nuevo a su nicho de números, los clientes de los compiladores de Fortran tienden a preocuparse más por la optimización que los clientes de los compiladores de C.

Sin embargo, no hay nada que impida a alguien poner un montón de esfuerzo en la optimización de su compilador de C y hacer que genere mejor código 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.


No hay nada acerca de los idiomas Fortran y C, lo 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 algunas sean más favorables para ciertas tareas que otras.

Durante muchos años, existían compiladores de Fortran que podían hacer magia negra a tus rutinas numéricas, haciendo que muchos cálculos importantes fueran increíblemente rápidos. Los compiladores de C contemporáneos no podían hacerlo también. Como resultado, una gran cantidad de grandes bibliotecas de código crecieron en Fortran. Si desea utilizar estas bibliotecas maravillosas, bien probadas y bien probadas, puede extraer el compilador Fortran.

Mis observaciones informales muestran que en estos días las personas codifican sus pesadas cosas de cómputo en cualquier lenguaje antiguo, y si toma un tiempo encuentran tiempo en algún grupo de cómputo barato. La Ley de Moore nos engaña a todos.


No he escuchado que Fortan sea significativamente más rápido que C, pero podría ser posible que en ciertos casos sea más rápido. Y la clave no está en las características del lenguaje que están presentes, sino en aquellas que (usualmente) están ausentes.

Un ejemplo son los punteros en c. Los punteros C se usan prácticamente en todas partes, pero el problema con los punteros es que el compilador generalmente no puede saber si están apuntando a las diferentes partes de la misma matriz.

Por ejemplo, si escribiste una rutina de strcpy que se veía así:

strcpy(char *d, const char* s) { while(*d++ = *s++); }

El compilador tiene que funcionar bajo el supuesto de que d y s podrían estar superpuestas a matrices. Por lo tanto, no puede realizar una optimización que produzca resultados diferentes cuando las matrices se superpongan. Como era de esperar, esto restringe considerablemente el tipo de optimizaciones que se pueden realizar.

[Debo tener en cuenta que C99 tiene una palabra clave "restringir" que le dice explícitamente a los compiladores que los punteros no se superponen. También tenga en cuenta que el Fortran también tiene punteros, con una semántica diferente de los de C, pero los punteros no son ubicuos como en C].

Pero volviendo al tema de C vs. Fortran, es posible que un compilador de Fortran sea capaz de realizar algunas optimizaciones que podrían no ser posibles para un programa de C (escrito de manera directa). Así que no me sorprendería demasiado con la afirmación. Sin embargo, espero que la diferencia de rendimiento no sea tanto. [~ 5-10%]


Rápido y simple: ambos son igualmente rápidos, pero Fortran es más simple. Lo que realmente es 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 computación de alto rendimiento Stuttgard, Alemania, en 2015. Trabajo tanto con Fortran como con 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 el código fácilmente.

Fortran fue diseñado para la programación científica. Por esta razón, es compatible con la escritura rápida de códigos de sintaxis, ya que este es el propósito principal de Fortran. En contraste con 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 de los códigos de alto rendimiento se escriben en Fortran. Fortran soporta además características modernas como directivas de compilación (en pragmas C).

Ejemplo: Queremos dar una estructura grande como un argumento de entrada a una función (fortran: subrutina). Dentro de la función el argumento no se altera.

C es compatible con 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 considerablemente las cosas, 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.


Soy un programador aficionado y soy "promedio" en ambos idiomas. Me resulta más fácil escribir el código Fortran rápido que el código C (o C ++). Tanto Fortran como C son lenguajes "históricos" (para el estándar de hoy), son muy utilizados y tienen un compilador comercial y gratuito 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 puro de la CPU amo 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 matemáticas paralelas es probable que desee utilizar su GPU. Tanto C como Fortran tienen mucha más o menos bien integrada interfaz CUDA / OpenCL (y ahora OpenACC).

Mi respuesta moderadamente objetiva es: si conoces ambos idiomas igualmente bien / mal, creo que Fortran es más rápido porque me parece más fácil escribir código paralelo / distribuido en Fortran que en C. (una vez que comprendiste que puedes escribir Fortran de "forma libre" y no solo el estricto código F77)

Aquí hay una segunda respuesta para aquellos que están dispuestos a votarme porque no les gusta la primera respuesta: ambos idiomas tienen las características necesarias para escribir código de alto rendimiento. Entonces, depende del algoritmo que estés implementando (¿cpu intensivo? ¿Intensivo? ¿Intensivo de memoria?), El hardware (un único núcleo de múltiples núcleos? Distribuye el supercomputador? GPGPU? ¿FPGA?), Tu habilidad y, en última instancia, el compilador en sí. Tanto C y Fortran tienen compilador impresionante. (Estoy realmente sorprendido de lo avanzados que son los compiladores de Fortran, pero también lo son los compiladores de C).

PD: me alegra que haya excluido específicamente las bibliotecas porque tengo muchas cosas malas que decir sobre las GUI de Fortran GUI. :)


Fortran tiene mejores rutinas de E / S, por ejemplo, la instalación implícita de do ofrece 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 puede reducirse fácilmente a la forma de pasar argumentos, C no puede implementarla de manera eficiente.


La mayoría de las publicaciones ya presentan argumentos convincentes, por lo que solo agregaré los 2 centavos proverbiales 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 se necesita 5 veces más tiempo para desarrollar algo en Fortran porque:

  • Carece de una buena biblioteca para tareas diferentes del procesamiento de números puros
  • Carece de cualquier herramienta decente para la documentación y las pruebas unitarias.
  • es un lenguaje con muy baja expresividad, que se dispara el número de líneas de código.
  • Tiene un manejo muy pobre de cuerdas.
  • Tiene una gran cantidad de problemas entre diferentes compiladores y arquitecturas que lo vuelven loco.
  • tiene una estrategia de IO muy pobre (LEA / ESCRIBE de archivos secuenciales. Sí, existen archivos de acceso aleatorio, pero ¿alguna vez los vio usados?)
  • No fomenta las buenas prácticas de desarrollo, la modularización.
  • falta efectiva de un compilador de código abierto completamente estándar y totalmente compatible (tanto gfortran como g95 no son compatibles con todo)
  • muy mala interoperabilidad con C (mutilación: un subrayado, dos subrayados, ningún subrayado, en general un subrayado, pero dos si hay otro subrayado. y no dejemos de explorar bloques COMUNES ...)

Entonces el asunto es irrelevante. Si algo es lento, la mayoría de las veces no puedes mejorarlo más allá de un límite dado. 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.


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 de restricción. Lo que básicamente le dice al compilador, que dentro de un alcance dado, el puntero no tiene alias. Además, C permite una aritmética de punteros adecuada, donde cosas como el aliasing 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 las 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 normalmente supera a Fortran en la mayoría de los casos (nuevamente vea las críticas a continuación que se aplican aquí también); 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.


El código más rápido no está realmente a la altura del lenguaje, es el compilador, por lo que puede ver el "compilador" ms-vb que genera un código de objeto hinchado, más lento y redundante que está vinculado dentro de un ".exe", pero que powerBasic genera demasiado. mejor codigo El código objeto creado por los compiladores 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, según el diseño, Fortran siempre tendrá la capacidad de generar código altamente optimizado. Entonces, al final, el compilador no es el idioma que debe solicitar, el mejor compilador que conozco es el Intel Fortran Compiler 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


Esto es más que algo subjetivo, ya que 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 un punto de vista de idioma / compilador, no hay nada sobre Fortran sobre C que lo hará inherentemente más rápido o mejor que C. la calidad del compilador, la habilidad del programador en cada lenguaje y las bibliotecas de soporte de matemáticas intrínsecas que admiten esas operaciones para determinar en última instancia cuál va a ser más rápido para una implementación determinada.

EDITAR: Otras personas como @Nils han planteado el punto positivo sobre la diferencia en el uso de punteros en C y la posibilidad de aliasing que quizás hace que las implementaciones más ingenuas sean más lentas en C. Sin embargo, hay formas de lidiar con eso en C99 , a través de indicadores de optimización del compilador y / o en cómo se escribe la C en realidad. Esto está bien cubierto en la respuesta de @Nils y en los comentarios subsiguientes que siguen a su respuesta.


Fortran puede manejar matrices, especialmente matrices multidimensionales, muy convenientemente. Cortar elementos de una matriz multidimensional en Fortran puede ser mucho más fácil que en C / C ++. C ++ ahora tiene bibliotecas que pueden hacer el trabajo, como Boost o Eigen, pero después de todo son bibliotecas externas. En Fortran estas funciones son intrínsecas.

Si Fortran es 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ía de los cálculos en Fortran (me refiero a Fortran moderno,> = F90).


Fortran tradicionalmente no establece opciones como -fp: strict (que ifort requiere para habilitar algunas de las funciones en USE IEEE_arithmetic, una parte del estándar f2003). Intel C ++ tampoco establece -fp: estricto como predeterminado, pero eso es necesario para el manejo de ERRNO, por ejemplo, y otros compiladores de C ++ no hacen que sea conveniente desactivar ERRNO u obtener optimizaciones como la reducción de SIMD. gcc y g ++ me han requerido configurar Makefile para evitar el uso de la combinación peligrosa -O3 -ffast-math -fopenmp -march = native. Aparte de estos problemas, esta pregunta sobre el rendimiento relativo se vuelve más delicada y depende de las reglas locales sobre la elección de compiladores y opciones.