web-dev-qa-db-fra.com

Fortran est-il plus facile à optimiser que C pour les calculs lourds?

De temps en temps, j'ai lu que Fortran est ou peut être plus rapide que C pour les calculs lourds. Est-ce vraiment vrai? Je dois avouer que je connais à peine Fortran, mais le code Fortran que j'ai vu jusqu'à présent ne montre pas que le langage comporte des fonctionnalités que C n'a pas.

Si c'est vrai, dites-moi pourquoi. S'il vous plaît, ne me dites pas quelles langues ou quelles bibliothèques sont bonnes pour faire des calculs, je n'ai pas l'intention d'écrire une application ou une bibliothèque pour le faire, je suis simplement curieux.

391
quinmars

Les langues ont des ensembles de fonctionnalités similaires. La différence de performances provient du fait que Fortran déclare que les alias ne sont pas autorisés, sauf si une instruction EQUIVALENCE est utilisée. Tout code qui a un alias n'est pas Fortran valide, mais c'est au programmeur et non au compilateur de détecter ces erreurs. Ainsi, les compilateurs Fortran ignorent le crénelage possible des pointeurs de mémoire et leur permettent de générer un code plus efficace. Jetez un oeil à ce petit exemple 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;
    }
}

Cette fonction serait plus lente que la contrepartie Fortran après optimisation. Pourquoi Si vous écrivez des valeurs dans le tableau de sortie, vous pouvez modifier les valeurs de la matrice. Après tout, les pointeurs pourraient se chevaucher et pointer vers le même bloc de mémoire (y compris le pointeur int!). Le compilateur C est obligé de recharger les quatre valeurs de matrice de la mémoire pour tous les calculs.

Dans Fortran, le compilateur peut charger les valeurs de la matrice une fois et les stocker dans des registres. Cela est possible car le compilateur Fortran suppose que les pointeurs/tableaux ne se chevauchent pas en mémoire.

Heureusement, le mot clé restrict et l'aliasing strict ont été introduits dans la norme C99 pour résoudre ce problème. Il est également bien supporté par la plupart des compilateurs C++. Le mot-clé vous permet d'indiquer au compilateur que le programmeur promet qu'un pointeur ne fait pas alias avec un autre pointeur. L'alias strict signifie que le programmeur promet que les pointeurs de types différents ne se chevaucheront jamais. Par exemple, un double* ne chevauchera pas avec un int* (à l'exception de char* et void* peut se chevaucher avec n'importe quoi).

Si vous les utilisez, vous obtiendrez la même vitesse que C et Fortran. Cependant, la possibilité d'utiliser le mot clé restrict uniquement avec des fonctions critiques de performance signifie que les programmes C (et C++) sont beaucoup plus sûrs et plus faciles à écrire. Par exemple, considérons le code Fortran invalide: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), que la plupart des compilateurs Fortran compileront volontiers sans aucun avertissement, mais qui introduira un bogue n'apparaissant que sur certains compilateurs, sur certains matériels et avec certaines options d'optimisation.

425
Nils Pipenbrinck

Oui, en 1980; En 2008? dépend

Lorsque j'ai commencé à programmer de manière professionnelle, la vitesse de prédilection de Fortran venait juste d'être remise en question. Je me souviens de lire à ce sujet dans Dr. Dobbs et raconter l'article aux programmeurs plus âgés - ils ont ri.

J'ai donc deux points de vue à ce sujet, théorique et pratique. En théorie , Fortran n'a aujourd'hui aucun avantage intrinsèque au C/C++, ni même à aucun langage autorisant le code d'assemblage. En pratique Fortran bénéficie encore aujourd'hui des avantages de l'héritage d'une histoire et d'une culture construites autour de l'optimisation du code numérique.

Jusqu'en Fortran 77 inclus, les considérations relatives à la conception des langues étaient principalement axées sur l'optimisation. En raison de l'état de la théorie et de la technologie du compilateur, cela impliquait souvent de restreindre les fonctionnalités afin de donner au compilateur la meilleure chance d'optimiser le code. Une bonne analogie est de penser que la Fortran 77 est une voiture de course professionnelle qui sacrifie les caractéristiques pour la vitesse. De nos jours, les compilateurs ont été améliorés dans toutes les langues et les fonctionnalités de productivité des programmeurs ont plus de valeur. Cependant, il existe encore des endroits où les gens sont principalement concernés par la rapidité du calcul scientifique; ces personnes ont très probablement hérité du code, de la formation et de la culture de personnes qui étaient elles-mêmes des programmeurs Fortran.

Quand on commence à parler d'optimisation du code, il y a de nombreux problèmes et le meilleur moyen de se faire une idée est se cacher où sont les gens qui sont chargés de coder rapidement . Mais gardez à l'esprit qu'un code aussi sensible est généralement très spécialisé: une grande partie du code Fortran est aussi "inefficace" que beaucoup d'autres codes dans d'autres langues et optimisation ne devrait même pas être une préoccupation principale de ce code .

Wikipedia est un merveilleux endroit pour commencer à apprendre sur l'histoire et la culture de Fortran. L’entrée de Wikipédia en Fortran est superbe et j’apprécie beaucoup ceux qui ont pris le temps et fait des efforts pour en faire une valeur pour la communauté Fortran.

(Une version abrégée de cette réponse aurait été un commentaire dans l'excellent fil de discussion commencé par Nils mais je n'ai pas le karma pour le faire. En fait , Je n’aurais probablement rien écrit du tout, c’est pour cela que ce fil a un contenu d’information et un partage réels, par opposition aux guerres de flammes et à la bigoterie des langues, qui est ma principale expérience en la matière. )

157
jaredor

Dans une certaine mesure, Fortran a été conçu en tenant compte de l'optimisation du compilateur. Le langage prend en charge les opérations sur un tableau complet où les compilateurs peuvent exploiter le parallélisme (en particulier sur les processeurs multicœurs). Par exemple,

La multiplication matricielle dense est simplement:

matmul(a,b)

La norme L2 d'un vecteur x est:

sqrt(sum(x**2))

De plus, des instructions telles que FORALL, PURE & ELEMENTAL procédures, etc. aident également à optimiser le code. Même les pointeurs en Fortran ne sont pas aussi flexibles que C en raison de cette simple raison.

Le prochain standard Fortran (2008) comporte des co-tableaux qui vous permettent d’écrire facilement du code parallèle. G95 (open source) et les compilateurs de CRAY le supportent déjà.

Alors oui, Fortran peut être rapide simplement parce que les compilateurs peuvent l’optimiser/le paralléliser mieux que le C/C++. Mais encore une fois, comme dans la vie, il y a de bons compilateurs et de mauvais compilateurs.

61
user49734

C'est drôle que beaucoup de réponses ici de ne pas connaître les langues. Cela est particulièrement vrai pour les programmeurs C/C++ qui ont ouvert et utilisent l'ancien code FORTRAN 77 et discutent des faiblesses.

Je suppose que la question de la vitesse est principalement une question entre C/C++ et Fortran. Dans un code énorme, cela dépend toujours du programmeur. Fortran surpasse certaines fonctionnalités du langage et C, certaines fonctionnalités. Donc, en 2011, personne ne peut vraiment dire lequel est le plus rapide.

En ce qui concerne le langage lui-même, Fortran prend actuellement en charge les fonctionnalités Full OOP et est totalement compatible avec les versions antérieures. J'ai utilisé le Fortran 2003 à fond et je dirais que c'était un plaisir de l'utiliser. Sous certains aspects, Fortran 2003 est toujours en retard sur C++, mais regardons l’utilisation. Fortran est principalement utilisé pour le calcul numérique, et personne n'utilise des fonctionnalités C++ OOP sophistiquées pour des raisons de rapidité. Dans l'informatique haute performance, le C++ n'a presque pas de place où aller (jetez un coup d'œil au standard MPI et vous verrez que le C++ est obsolète!).

De nos jours, vous pouvez simplement faire de la programmation en plusieurs langues avec Fortran et C/C++. Il existe même des interfaces pour GTK + en Fortran. Il existe des compilateurs gratuits (gfortran, g95) et de nombreux excellents logiciels commerciaux.

38
Hossein Talebi

Fortran pourrait être plus rapide pour plusieurs raisons. Cependant, leur montant est si insignifiant ou peut être modifié de toute façon, cela ne devrait pas y avoir d'importance. De nos jours, la principale raison d'utiliser Fortran est la maintenance ou l'extension des applications héritées.

  • Mots-clés PURE et ELEMENTAL sur les fonctions. Ce sont des fonctions qui n'ont pas d'effets secondaires. Cela permet des optimisations dans certains cas où le compilateur sait que la même fonction sera appelée avec les mêmes valeurs. Remarque: GCC implémente "pure" en tant qu'extension du langage. D'autres compilateurs peuvent également. L'analyse inter-module peut également effectuer cette optimisation mais c'est difficile.

  • ensemble standard de fonctions qui traitent de tableaux, pas d'éléments individuels. Des choses comme sin (), log (), sqrt () prennent des tableaux à la place de scalaires. Cela facilite l'optimisation de la routine. La vectorisation automatique offre les mêmes avantages dans la plupart des cas si ces fonctions sont intégrées ou intégrées

  • Type complexe intégré. En théorie, cela pourrait permettre au compilateur de réorganiser ou d’éliminer certaines instructions dans certains cas, mais vous verriez probablement le même avantage avec struct {double re, im; }; Langage utilisé en C. Cela permet un développement plus rapide, car les opérateurs travaillent sur des types complexes en fortran.

28
Greg Rogers

Je pense que le point clé en faveur de Fortran est qu’il s’agit d’un langage légèrement plus adapté à l’expression de mathématiques basées sur les vecteurs et les matrices. Le problème d'analyse du pointeur mentionné ci-dessus est réel dans la pratique, car le code portable ne peut pas vraiment supposer que vous pouvez dire quelque chose au compilateur. Il existe TOUJOURS un avantage pour les calculs d’expression de manière plus proche de l’apparence du domaine. C n’a pas vraiment de tableaux du tout, si vous regardez bien, juste quelque chose qui se comporte de la sorte. Fortran a de véritables arrawys. Ce qui facilite la compilation de certains types d’algorithmes, en particulier des machines parallèles.

Au fond des choses comme le système d’exécution et les conventions d’appel, C et Fortran moderne sont suffisamment similaires pour qu’il soit difficile de voir ce qui pourrait changer les choses. Notez que C est vraiment une base C: C++ est un problème totalement différent avec des caractéristiques de performances très différentes.

27
jakobengblom2

Il n’existe pas de langue plus rapide que d’autre langue, la réponse correcte est donc non.

Ce que vous devez vraiment demander, c'est "le code compilé avec le compilateur Fortran X est-il plus rapide que le code équivalent compilé avec le compilateur C Y?" La réponse à cette question dépend bien sûr des deux compilateurs que vous choisissez.

Une autre question que l’on pourrait se poser serait la suivante: "Avec le même effort d’optimisation dans leurs compilateurs, quel compilateur produirait du code plus rapide? La réponse à cette question serait en fait Fortran . Les compilateurs Fortran ont des avantages certian:

  • Fortran devait concurrencer l’Assemblée à l’époque où certains ont juré de ne jamais utiliser de compilateurs, ce qui a été conçu pour la vitesse. C a été conçu pour être flexible.
  • Le créneau de Fortran a été le calcul du nombre. Dans ce domaine, le code est jamais assez rapidement. Il y a donc toujours eu beaucoup de pression pour que le langage soit efficace.
  • La plupart des recherches sur l'optimisation des compilateurs sont effectuées par des personnes intéressées par une accélération du code de compression de données Fortran. L'optimisation du code Fortran est donc un problème bien mieux connu que l'optimisation de tout autre langage compilé. De nouvelles innovations apparaissent d'abord dans les compilateurs Fortran.
  • Biggie: C encourage l'utilisation beaucoup plus de pointeur que Fortran. Cela augmente considérablement la portée potentielle de tout élément de données dans un programme C, ce qui le rend beaucoup plus difficile à optimiser. Notez qu'Ada est également bien meilleur que le C dans ce domaine et qu'il est un langage beaucoup plus moderne OO que le très répandu Fortran77. Si vous voulez une langue OO pouvant générer du code plus rapide que le code C, cette option est pour vous.
  • Encore une fois, en raison de son créneau de chiffres, les clients des compilateurs Fortran ont tendance à se préoccuper davantage de l'optimisation que les clients des compilateurs C.

Cependant, rien n'empêche quelqu'un de faire beaucoup d'efforts pour l'optimisation de son compilateur C et de le faire générer un meilleur code que le compilateur Fortran de sa plate-forme. En fait, les ventes plus importantes générées par les compilateurs C rendent ce scénario tout à fait réalisable

23
T.E.D.

Il existe un autre élément pour lequel Fortran est différent de C - et potentiellement plus rapide. Fortran a de meilleures règles d'optimisation que C. En Fortran, l'ordre d'évaluation d'une expression n'est pas défini, ce qui permet au compilateur de l'optimiser - si l'on veut forcer un certain ordre, il faut utiliser des parenthèses. En C, l'ordre est beaucoup plus strict, mais avec les options "-fast", elles sont plus détendues et "(...)" sont également ignorées. Je pense que Fortran a un chemin qui se situe bien au milieu. (Eh bien, l’IEEE rend la vie plus difficile car certains changements d’ordre d’évaluation exigent qu’il n’y ait pas de débordement, ce qui doit être ignoré ou gêner l’évaluation).

Les nombres complexes constituent un autre domaine de règles plus intelligentes. Non seulement il a fallu attendre C 99 pour que C les ait, mais les règles qui les régissent sont meilleures à Fortran; puisque la bibliothèque Fortran de gfortran est partiellement écrite en C mais implémente la sémantique Fortran, GCC a obtenu l'option (qui peut également être utilisée avec les programmes C "normaux"):

-fcx-fortran-rules La multiplication et la division complexes suivent les règles de Fortran. La réduction de la portée est effectuée dans le cadre d'une division complexe, mais il n'est pas vérifié si le résultat d'une multiplication ou d'une division complexe est "NaN + I * NaN", une tentative visant à sauver la situation dans ce cas.

Les règles de pseudonymes mentionnées ci-dessus constituent un autre atout, mais aussi, du moins en principe, les opérations sur l'ensemble du tableau qui, si elles sont correctement prises en compte par l'optimiseur du compilateur, peuvent générer un code plus rapide. En revanche, certaines opérations prennent plus de temps, par exemple. si on fait une assignation à un tableau pouvant être alloué, de nombreuses vérifications sont nécessaires (réaffecter? [fonctionnalité Fortran 2003], le tableau avance-t-il, etc.), ce qui rend l'opération simple plus complexe en coulisse - et donc plus lente, mais rend le langage plus puissant. D'autre part, les opérations de tableau avec des limites et des étapes flexibles facilitent l'écriture de code - et le compilateur optimise généralement mieux le code qu'un utilisateur.

Au total, je pense que C et Fortran sont à peu près aussi rapides; le choix devrait être davantage la langue que vous préférez ou l'utilisation des opérations sur l'ensemble du tableau de Fortran et sa meilleure portabilité sont plus utiles - ou le meilleur interfaçage avec les bibliothèques système et d'interface graphique utilisateur en C.

22
T B

Il n'y a rien à propos des langages Fortran et C, qui rend l'une plus rapide que l'autre à des fins spécifiques. Il y a des choses à propos de compilateurs pour chacune de ces langues qui rendent certaines plus favorables à certaines tâches que d'autres.

Pendant de nombreuses années, les compilateurs Fortran ont existé et pourraient faire de la magie noire à vos routines numériques, rendant incroyablement rapides des calculs importants. Les compilateurs C contemporains ne pourraient pas le faire aussi bien. En conséquence, plusieurs grandes bibliothèques de code se sont développées à Fortran. Si vous souhaitez utiliser ces merveilleuses bibliothèques bien testées, matures et abouties, vous sortez le compilateur Fortran.

Mes observations informelles montrent que ces jours-ci, les gens codent leurs calculs lourds dans n’importe quelle langue, et s’ils mettent un peu de temps, ils trouvent du temps sur des grappes de calcul bon marché. La loi de Moore fait de nous des imbéciles.

14
jfm3

Je faisais des mathématiques approfondies avec FORTRAN et C pendant quelques années. D'après ma propre expérience, je peux dire que FORTRAN est parfois vraiment meilleur que C mais pas pour sa rapidité (on peut faire en sorte que C fonctionne aussi vite que FORTRAN en utilisant un style de codage approprié), mais plutôt à cause de librairies très bien optimisées comme LAPACK, et à cause de grande parallélisation. À mon avis, il est vraiment difficile de travailler avec FORTRAN et ses avantages ne sont pas suffisants pour supprimer cet inconvénient; je me sers maintenant de C + GSL pour effectuer des calculs.

11
grzkv

Je suis un programmeur amateur et je suis "moyen" dans les deux langues. Je trouve qu'il est plus facile d'écrire du code Fortran rapide que du code C (ou C++). Le Fortran et le C sont tous les deux des langages "historiques" (aujourd’hui standard), sont très utilisés et ont bien pris en charge les compilateurs libres et commerciaux.

Je ne sais pas si c'est un fait historique, mais Fortran a le sentiment qu'il est construit pour être mis en parallèle, distribué, vectorisé ou peu importe. Et aujourd’hui, c’est à peu près la "métrique standard" en matière de vitesse: "est-ce que cela s’adapte?"

Pour le calcul pur, j'aime Fortran. Pour tout ce qui concerne IO, je trouve qu'il est plus facile de travailler avec C. (difficile dans les deux cas de toute façon).

Maintenant, bien sûr, pour le code intensif en mathématiques parallèles, vous souhaiterez probablement utiliser votre GPU. C et Fortran ont tous les deux une interface plus ou moins bien intégrée CUDA/OpenCL (et maintenant OpenACC).

Ma réponse moyennement objective est la suivante: si vous connaissez les deux langues également/mal, alors je pense que Fortran est plus rapide parce que je trouve plus facile d’écrire du code parallèle/distribué en Fortran que C. (une fois que vous avez compris que vous pouvez écrire "freeform" pour pas seulement le code F77 strict)

Voici une deuxième réponse pour ceux qui sont prêts à me renverser parce qu'ils n'aiment pas la première réponse: les deux langues possèdent les fonctionnalités requises pour écrire du code haute performance. Donc, cela dépend de l’algorithme que vous implémentez (intensif en cpu? Intensif? Intensif en mémoire?), Du matériel (un seul cpu? Supercalculateur? Superordinateur? GPGPU? FPGA?), De vos compétences et finalement du compilateur lui-même. C et Fortran ont tous les deux un compilateur génial. (Je suis vraiment étonné par la façon dont les compilateurs Fortran sont avancés, mais les compilateurs C le sont également).

PS: Je suis heureux que vous ayez spécifiquement exclu les bibliothèques, car j’ai beaucoup de mauvaises choses à dire sur les bibliothèques à interface graphique Fortran. :)

11
ker2x

Je n'ai pas entendu dire que Fortan est nettement plus rapide que C, mais il est peut-être concevable que dans certains cas, ce soit plus rapide. Et la clé ne réside pas dans les fonctionnalités linguistiques présentes, mais dans celles qui (généralement) sont absentes.

Un exemple sont les pointeurs C. Les pointeurs C sont utilisés un peu partout, mais le problème avec les pointeurs est que le compilateur ne peut généralement pas dire s'ils pointent vers les différentes parties du même tableau.

Par exemple, si vous avez écrit une routine strcpy qui ressemble à ceci:

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

Le compilateur doit travailler en supposant que les tableaux d et s peuvent se chevaucher. Donc, il ne peut pas effectuer une optimisation qui produirait des résultats différents lorsque les tableaux se chevauchent. Comme vous vous en doutez, cela limite considérablement le type d'optimisations pouvant être effectuées.

[Je dois noter que C99 a un mot clé "restrict" qui indique explicitement aux compilateurs que les pointeurs ne se chevauchent pas. Notez également que le Fortran a aussi des pointeurs, avec une sémantique différente de celle de C, mais que les pointeurs ne sont pas omniprésents comme en C.]

Mais revenons à la question C vs Fortran, il est concevable qu’un compilateur Fortran puisse effectuer certaines optimisations qui pourraient ne pas être possibles pour un programme C (écrit directement). Donc, je ne serais pas trop surpris par la demande. Cependant, je m'attends à ce que la différence de performance ne soit pas si importante. [~ 5-10%]

10
Pramod

Rapide et simple: Les deux sont également rapides, mais Fortran est plus simple. Ce qui est vraiment plus rapide à la fin dépend de l'algorithme, mais il n'y a pas de différence de vitesse considérable en tous cas. C'est ce que j'ai appris dans un atelier Fortran au centre de calcul de haute performance Stuttgard, en Allemagne, en 2015. Je travaille à la fois avec Fortran et C et partage cet avis.

Explication:

C a été conçu pour écrire des systèmes d'exploitation. Par conséquent, il a plus de liberté que nécessaire pour écrire du code haute performance. En général, ce n’est pas un problème, mais si on ne programme pas soigneusement, on peut facilement ralentir le code.

Fortran a été conçu pour la programmation scientifique. Pour cette raison, il prend en charge l’écriture rapide de code rapide, car c’est l’objectif principal de Fortran. Contrairement à l'opinion publique, Fortran n'est pas un langage de programmation obsolète. Son dernier standard date de 2010 et de nouveaux compilateurs sont publiés régulièrement, car la plupart des codes haute performance sont écrits en Fortran. Fortran supporte également les fonctionnalités modernes en tant que directives de compilation (dans les pragmas C).

Exemple: Nous voulons donner une grande structure en tant qu'argument d'entrée à une fonction (fortran: sous-programme). Dans la fonction, l'argument n'est pas modifié.

C prend en charge les deux, appel par référence et appel par valeur, ce qui est une fonctionnalité pratique. Dans notre cas, le programmeur pourrait utiliser accidentellement appel par valeur. Cela ralentit considérablement les choses, car la structure doit d'abord être copiée dans la mémoire.

Fortran fonctionne uniquement avec appel par référence, ce qui oblige le programmeur à copier manuellement la structure, s’il souhaite réellement une opération appel par valeur. Dans notre cas, fortran sera automatiquement aussi rapide que la version C avec appel par référence.

9
Markus Dutschke

Toute différence de vitesse entre Fortran et C sera davantage une fonction des optimisations du compilateur et de la bibliothèque mathématique sous-jacente utilisée par le compilateur en question. Il n'y a rien de intrinsèque à Fortran qui le ferait plus vite que C.

Quoi qu’il en soit, un bon programmeur peut écrire en Fortran dans n’importe quelle langue.

9
Kluge

Généralement, FORTRAN est plus lent que le carbone. C peut utiliser des pointeurs de niveau matériel permettant au programmeur d’optimiser à la main. FORTRAN (dans la plupart des cas) n'a pas accès à la mémoire matérielle qui s'adresse aux hacks. (VAX FORTRAN est une autre histoire.) J'ai utilisé le FORTRAN de temps en temps depuis les années 70. (Vraiment.)

Cependant, à partir des années 90, FORTRAN a évolué pour inclure des constructions de langage spécifiques qui peuvent être optimisées dans des algorithmes intrinsèquement parallèles qui peuvent vraiment crier sur un processeur multicœur . Par exemple, la vectorisation automatique permet à plusieurs processeurs de gérer simultanément chaque élément d'un vecteur de données. 16 processeurs - 16 éléments vectoriels - le traitement prend 1/16ème du temps.

En C, vous devez gérer vos propres threads et concevoir votre algorithme avec soin pour le multitraitement, puis utiliser de nombreux appels d'API pour vous assurer que le parallélisme se produit correctement.

En Fortran, il vous suffit de concevoir votre algorithme avec soin pour le multi-traitement. Le compilateur et le run-time peuvent gérer le reste pour vous.

Vous pouvez lire un peu sur High Performance Fortran , mais vous trouvez beaucoup de liens morts. Vous feriez mieux de lire sur la programmation parallèle (comme OpenMP.org ) et sur le support de FORTRAN.

7
S.Lott

Le code le plus rapide n’est pas vraiment à la portée du langage, c’est le compilateur pour que vous puissiez voir le "compilateur" ms-vb qui génère un code objet saturé, plus lent et redondant qui est lié dans un ".exe", mais powerBasic génère trop meilleur code. Le code objet créé par les compilateurs C et C++ est généré en quelques phases (au moins 2), mais la conception de la plupart des compilateurs Fortran comporte au moins 5 phases, y compris des optimisations de haut niveau. Par conséquent, Fortran aura toujours la capacité de générer du code hautement optimisé. Donc, à la fin, le compilateur n'est pas le langage que vous devriez demander, le meilleur compilateur que je connaisse est le compilateur Intel Fortran, car vous pouvez l'obtenir sur LINUX et Windows et vous pouvez utiliser VS comme IDE, si vous recherchez une compilateur Tigh bon marché, vous pouvez toujours relayer sur OpenWatcom.

Plus d'informations à ce sujet: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html

5
JPerez45

Fortran a de meilleures routines d’entrées/sorties, par exemple la facilité implicite donne une flexibilité à laquelle la bibliothèque standard de C ne peut pas correspondre.

Le compilateur Fortran gère directement la syntaxe la plus complexe impliquée, et comme une telle syntaxe ne peut pas être facilement réduite à une forme de transmission d'arguments, C ne peut pas la mettre en œuvre efficacement.

3
Zeus

Fortran peut gérer les tableaux, particulièrement les tableaux multidimensionnels, de manière très pratique. Le découpage d'éléments d'un tableau multidimensionnel en Fortran peut s'avérer beaucoup plus simple qu'en C/C++. C++ a maintenant des bibliothèques peuvent faire le travail, tels que Boost ou Eigen, mais ils sont après toutes les bibliothèques externes. En Fortran, ces fonctions sont intrinsèques.

Que Fortran soit plus rapide ou plus pratique à développer dépend principalement du travail que vous devez terminer. En tant que spécialiste du calcul scientifique en géophysique, j'ai effectué l'essentiel du calcul en Fortran (je veux dire le Fortran moderne,> = F90).

2
Kai

En utilisant les standards et le compilateur modernes, non!

Certaines personnes ici ont suggéré que FORTRAN est plus rapide, car le compilateur n'a pas à se soucier de l'aliasing (et peut donc faire davantage d'hypothèses lors de l'optimisation). Cependant, cela a été traité en C depuis la norme C99 (je pense) avec l’inclusion du mot clé restrict. Ce qui indique fondamentalement au compilateur, que dans une portée, le pointeur n'est pas aliasé. De plus, C permet une arithmétique correcte du pointeur, où des alias peuvent être très utiles en termes de performance et d’allocation de ressources. Bien que je pense que les versions plus récentes de FORTRAN permettent l’utilisation d’indicateurs "appropriés".

Pour les implémentations modernes, C est plus performant que FORTRAN (même s’il est très rapide aussi).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

MODIFIER:

Une critique juste à ce sujet semble être que le benchmarking peut être biaisé. Voici une autre source (relative à C) qui place le résultat dans plus de contexte:

http://julialang.org/benchmarks/

Vous pouvez voir que C surpasse généralement Fortran dans la plupart des cas (voir à nouveau les critiques ci-dessous qui s'appliquent également ici); comme d'autres l'ont déjà dit, l'analyse comparative est une science inexacte qui peut facilement être utilisée pour favoriser une langue par rapport à d'autres. Mais cela met en contexte comment Fortran et C ont des performances similaires.

2
cdcdcd

C’est plus que quelque chose de subjectif, car cela touche plus que tout à la qualité des compilateurs. Cependant, pour répondre plus directement à votre question, du point de vue du compilateur, il n’existe rien qui permette à Fortran sur C de le rendre intrinsèquement plus rapide ou meilleur que C. Si vous effectuez des opérations mathématiques lourdes, cela se résumera au la qualité du compilateur, la compétence du programmeur dans chaque langue et les bibliothèques de support mathématique intrinsèques qui prennent en charge ces opérations pour déterminer en fin de compte laquelle sera la plus rapide pour une implémentation donnée.

EDIT: D'autres personnes telles que @Nils ont soulevé le point positif concernant la différence d'utilisation des pointeurs en C et la possibilité d'un aliasing qui ralentit peut-être les implémentations les plus naïves en C. Cependant, il existe des moyens de gérer cela en C99 , via les drapeaux d’optimisation du compilateur et/ou dans la manière dont le C est écrit. Ceci est bien couvert dans la réponse de @Nils et dans les commentaires qui suivent sur sa réponse.

1
Tall Jeff

La plupart des articles présentent déjà des arguments convaincants, je vais donc simplement ajouter les 2 centimes proverbiaux à un aspect différent.

Etre plus rapide ou plus lent en termes de puissance de traitement peut finalement avoir son importance, mais si cela prend 5 fois plus de temps pour développer quelque chose en Fortran parce que:

  • il ne manque aucune bonne bibliothèque pour des tâches différentes de la numérotation pure
  • il manque tout outil décent pour la documentation et les tests unitaires
  • c'est un langage à très faible expressivité, qui grimpe en flèche le nombre de lignes de code.
  • il a une très mauvaise manipulation des cordes
  • il y a une quantité infime de problèmes parmi différents compilateurs et architectures qui vous rendent fous.
  • il a une très mauvaise stratégie IO (LIRE/ÉCRIRE des fichiers séquentiels. Oui, les fichiers à accès aléatoire existent, mais les avez-vous déjà vus utilisés?)
  • cela n'encourage pas les bonnes pratiques de développement, la modularisation.
  • absence effective d'un compilateur opensource entièrement standard et entièrement conforme (gfortran et g95 ne supportent pas tout)
  • très mauvaise interopérabilité avec C (altération: un soulignement, deux soulignements, aucun soulignement, en général un soulignement, mais deux s'il y a un autre soulignement. et il suffit de ne pas fouiller dans les blocs COMMON ...)

Alors la question est sans importance. Si quelque chose est lent, la plupart du temps, vous ne pouvez pas l'améliorer au-delà d'une limite donnée. Si vous voulez quelque chose de plus rapide, changez l’algorithme. En fin de compte, le temps passé sur l'ordinateur est bon marché. Le temps humain n'est pas. Valorisez le choix qui réduit le temps humain. Si cela augmente le temps d’ordinateur, c’est rentable quand même.

0
Stefano Borini