Pregunta

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 tiene.

Si es verdad, 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.

¿Fue útil?

Solución

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 porción de 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 de Fortran supone que los punteros / matrices no se superponen en la memoria.

Afortunadamente, la palabra clave restringir y el aliasing estricto han sido introducido a la norma C99 para abordar 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 usar la palabra clave restrict 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 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 con gusto sin ningún aviso, pero presenta un error que solo aparece en algunos compiladores, en algunos equipos y con algunas opciones de optimización.

Otros consejos

Sí, en 1980; ¿en 2008? depende

Cuando comencé a programar profesionalmente, el dominio de la velocidad de Fortran estaba siendo desafiado. Recuerdo leyendo sobre en Dr. Dobbs y contándoles a los programadores mayores sobre el artículo, se rieron.

Entonces 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 ensamblador. En la práctica Fortran hoy todavía disfruta de los beneficios del legado de una historia y cultura construida alrededor de la optimización del código numérico.

Hasta Fortran 77 inclusive, las consideraciones de diseño de 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 familiarizarse con esto es para 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 es generalmente una pequeña fracción de las líneas generales de código y muy especializado: una gran cantidad de código Fortran es igual de 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 quienes se han tomado el tiempo y el esfuerzo para hacer Es de valor 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 cualquier cosa, excepto por eso, este hilo tiene contenido de información real y el intercambio 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).

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 matriz densa es simplemente:

matmul(a,b)

La norma L2 de un vector x es:

sqrt(sum(x**2))

Además, declaraciones como FORALL , PURE & amp; Los procedimientos de 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 arreglos conjuntos 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.

Es curioso que 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 funciones OOP completas y es totalmente compatible con versiones anteriores. He usado el Fortran 2003 a fondo y diría que fue un placer utilizarlo. 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 obsoleto).

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.

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, 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 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 " pure " 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 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 están en línea o integradas

  • Tipo complejo incorporado. En teoría, esto podría permitir al compilador reordenar o eliminar 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.

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 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 existe una ventaja para las expresiones de cómputo de una manera más cercana a cómo se ve el dominio. C realmente no tiene matrices en absoluto, si lo miras de cerca, 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 básico C: C ++ es un problema totalmente diferente con características de rendimiento muy diferentes.

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

Lo que realmente tiene que 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 se podría hacer sería la de "Dada la misma cantidad de esfuerzo 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:

  • 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 parte de la investigación en optimizaciones de compiladores es realizada por personas interesadas en acelerar el código de clasificación de números de Fortran, por lo que optimizar el código de Fortran es un problema mucho más conocido que optimizar cualquier otro lenguaje compilado, y las nuevas innovaciones aparecen primero en los compiladores de Fortran.
  • Biggie : C recomienda mucho más uso de punteros que Fortran. Esto aumenta drásticamente el alcance potencial de cualquier elemento de datos en un programa de 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 comúnmente encontrado. Si desea un lenguaje OO que pueda generar un código más rápido que C, esta es una opción para usted.
  • Nuevamente, debido a su nicho numérico, los clientes de los compiladores Fortran tienden a preocuparse más por la optimización que los clientes de los compiladores C.

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

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 " -fast " opciones, son más relajadas y "(...)" También se ignoran. Creo que Fortran tiene un camino que está muy bien en el medio. (Bueno, IEEE hace que la vida sea más difícil 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 eso tomó hasta C 99 que C los tenía, 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 normales de C):

  

-fcx-fortran-rules   La multiplicación y división complejas siguen las reglas de Fortran. La reducción de rango se realiza como parte de una división compleja, pero no se comprueba 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 opuesto están ciertas operaciones que toman más tiempo, por ej. 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.), lo que hace que la operación simple sea 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 casi igual de 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.

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, existieron 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 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 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.

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-vectores 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 hay un ejercicio mínimo de alineación automática de funciones 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 alineación.

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

Con respecto a la publicación que vino 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.

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.

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 " históricos " los idiomas (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 puro crujido de la CPU, me encanta Fortran. Para cualquier cosa relacionada con IO, me resulta más fácil trabajar con C. (es difícil en ambos casos de todos modos).

Ahora, por supuesto, para el código paralelo de matemática intensiva, probablemente 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 bien ambos idiomas, 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 " forma libre " fortran y no solo código F77 estricto)

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? ¿Io intensivo? ¿Intensivo de memoria?), El hardware (un cpu único, multi-core? Distribuye el supercomputador? GPGPU? ¿FPGA?), Tu habilidad y, en última instancia, el compilador en sí. Tanto C como Fortran tienen un increíble compilador. (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 hayas excluido específicamente las librerías porque tengo muchas cosas malas que decir sobre las librerías GUI de Fortran. :)

No he escuchado que Fortan es significativamente más rápido que C, pero podría concebirse que en algunos 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 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 parecía a esto:

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 superponiendo 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 notar que C99 tiene un " restringir " palabra clave 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 a la cuestión de C vs. Fortran, es posible que un compilador de Fortran pueda 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 el reclamo. Sin embargo, espero que la diferencia de rendimiento no sea tanto. [~ 5-10%]

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 haga más rápido que C.

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

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 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 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 además admite 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 funciona solo con llamada por referencia, lo que obliga al programador a copiar la estructura a mano, si realmente desea 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.

Generalmente, FORTRAN es más lento que C. C puede usar punteros de nivel de hardware, lo que permite 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 pueden realmente gritar en un procesador de múltiples 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, debes administrar tus propios subprocesos y diseñar tu algoritmo cuidadosamente para el multiprocesamiento, y luego usar un montón de llamadas a la API para asegurarte de que el paralelismo se realice correctamente.

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

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

El código más rápido no depende realmente del lenguaje, es el compilador para que pueda ver el compilador ms-vb " eso genera un código objeto hinchado, más lento y redundante que está unido dentro de un ".exe", pero powerBasic genera un código mucho mejor. 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

Fortran tiene mejores rutinas de E / S, por ejemplo, La facilidad implícita de do proporciona flexibilidad que la biblioteca estándar de C no puede igualar.

El compilador Fortran maneja directamente los más complejos sintaxis involucrada, y como tal, la sintaxis no se puede reducir fácilmente al argumento pasando formulario, C no puede implementarlo eficientemente.

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 "apropiado" punteros.

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.

Fortran puede manejar una matriz, especialmente 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.

Si Fortran es más rápido o más conveniente para el desarrollo depende principalmente 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).

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 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 idioma y las bibliotecas de soporte de matemáticas intrínsecas que admiten esas operaciones para determinar en última instancia cuál será más rápido para una implementación determinada.

EDITAR: otras personas como @Nils han planteado el punto positivo acerca de 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 que en C99, a través de los indicadores de optimización del compilador y / o en cómo se escribe C Esto está bien cubierto en la respuesta de @Nils y en los comentarios subsiguientes que siguen a su respuesta.

La mayoría de las publicaciones ya presentan argumentos convincentes, así 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 potencia de procesamiento al final puede tener su importancia, pero si lleva 5 veces más tiempo desarrollar algo en Fortran porque:

  • carece de una buena biblioteca para tareas diferentes de la suma de números pura
  • carece de una herramienta decente para la documentación y las pruebas unitarias
  • es un lenguaje con muy baja expresividad, disparando la cantidad de líneas de código.
  • tiene un manejo muy pobre de las cadenas
  • tiene una gran cantidad de problemas entre diferentes compiladores y arquitecturas que te vuelven loco.
  • tiene una estrategia de E / S muy pobre (LEER / ESCRIBIR archivos secuenciales. Sí, existen archivos de acceso aleatorio, pero ¿los vio utilizados alguna vez?)
  • no fomenta las buenas prácticas de desarrollo, la modularización.
  • falta efectiva de un compilador de código abierto totalmente estándar y totalmente compatible (tanto gfortran como g95 no admiten todo)
  • interoperabilidad muy pobre con C (desgarro: un guión bajo, dos guiones bajos, ningún guión bajo, en general un guión bajo pero dos si hay otro guión bajo. y simplemente no permita profundizar en los bloques COMUNES ...)

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.

Fortran tradicionalmente no establece opciones como -fp: estricto (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 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. Aparte 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top