Pergunta

De vez em quando eu li que Fortran é ou pode ser mais rápido, então C para cálculos pesados. isso é realmente verdade? Devo admitir que eu mal sei Fortran, mas o código Fortran que eu tenho visto até agora não mostraram que a linguagem tem características que C não tem.

Se é verdade, por favor me diga o porquê. Por favor, não me diga que línguas ou libs são bons para processamento de números, não tenho a intenção de escrever um aplicativo ou lib para fazer isso, eu sou apenas um curioso.

Foi útil?

Solução

As línguas têm longas-conjuntos semelhantes. A diferença de desempenho vem do fato de que Fortran diz aliasing não é permitido, a menos que uma declaração de equivalência é utilizada. Qualquer código que tem aliasing não é válido Fortran, mas cabe ao programador e não o compilador para detectar esses erros. Assim Fortran ignorar possível aliasing de ponteiros de memória e permitir-lhes gerar código mais eficiente. Dê uma olhada neste pequeno exemplo em 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 função seria executado mais lento do que a contrapartida Fortran após a otimização. Por quê então? Se você escrever valores na matriz de saída, você pode alterar os valores de matriz. Afinal, os ponteiros poderia sobrepor-se e apontam para o mesmo pedaço de memória (incluindo o ponteiro int!). O compilador C é obrigado a recarregar os quatro valores da matriz de memória para todos os cálculos.

Em Fortran o compilador pode carregar os valores da matriz uma vez e armazená-los em registos. Ele pode fazê-lo porque o compilador Fortran assume ponteiros / matrizes não se sobrepõem na memória.

Felizmente, o restrict palavra-chave e rigoroso-aliasing foram introduzidas para o padrão C99 para o endereço este problema. É bem suportado na maioria dos compiladores C ++ esses dias também. A palavra-chave permite que você dê o compilador um indício de que as promessas programador que um ponteiro não alias com qualquer outro ponteiro. Os meios rigorosos-aliasing que as promessas programador que ponteiros de tipo diferente jamais sobreposição, por exemplo, um double* não vai sobreposição com um int* (com a exceção específica que char* e void* pode se sobrepor a qualquer coisa).

Se você usá-los você vai ter a mesma velocidade de C e Fortran. No entanto, a capacidade de usar o restrict palavra-chave apenas com desempenho crítico funções significa que os programas C (e C ++) são muito mais seguro e mais fácil de escrever. Por exemplo, considere o código Fortran inválido:. CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), que compiladores mais Fortran será compilado felizmente sem qualquer aviso, mas introduz um bug que só aparece em alguns compiladores, em algum hardware e com algumas opções de otimização

Outras dicas

Sim, em 1980; Em 2008? depende

Quando comecei a programar profissionalmente o domínio velocidade do Fortran estava sendo desafiado. Lembro-me ler sobre -lo no Dr. Dobbs e dizendo aos programadores mais velhos sobre o artigo -. riram

Então, eu tenho duas visões sobre isso, teórico e prático. Em teoria Fortran hoje não tem nenhuma vantagem intrínseca para C / C ++ ou mesmo qualquer linguagem que permite a montagem de código. Na prática Fortran hoje ainda goza os benefícios do legado de uma história e cultura construída em torno de otimização do código numérico.

Até e incluindo Fortran 77, considerações de design linguagem tinha otimização como um foco principal. Devido ao estado da teoria do compilador e da tecnologia, isso muitas vezes significa restringindo Características e capacidade para dar o compilador a melhor chance de otimizar o código. Uma boa analogia é pensar em Fortran 77 como um carro de corrida profissional que sacrifícios apresenta para a velocidade. Estes dias compiladores ter começado melhor em todos os idiomas e recursos de produtividade do programador são mais valorizados. No entanto, ainda existem lugares onde as pessoas estão preocupadas principalmente com a velocidade em computação científica; essas pessoas provavelmente ter herdado código, formação e cultura de pessoas que se foram programadores Fortran.

Quando se começa a falar sobre otimização de código há muitas questões e a melhor maneira de começar uma sensação para isso é para se escondem onde as pessoas estão cujo trabalho é ter o código rápido numérica . Mas tenha em mente que tal código criticamente sensível é geralmente uma pequena fração das linhas gerais do código e muito especializada: Um monte de código Fortran é apenas como "ineficiente", como um monte de outros códigos em outros idiomas e otimização não deve mesmo ser uma preocupação primordial de tal código .

Um lugar maravilhoso para começar em aprender sobre a história ea cultura de Fortran é wikipedia. A entrada Fortran Wikipedia é excelente e eu aprecio muito aqueles que tenham tomado a tempo e esforço para fazer -lo de valor para a comunidade Fortran.

(A encurtado versão desta resposta teria sido um comentário no excelente linha começada por Nils , mas eu não tenho o carma de fazer isso. Na verdade, eu provavelmente não teria escrito qualquer coisa mas para que esta discussão tem conteúdo real informação e partilha, em oposição às guerras de chama e intolerância linguagem, que é a minha principal experiência com este assunto. Eu estava sobrecarregado e teve que compartilhar o amor.)

Em certa medida Fortran vem mantendo projetado otimização do compilador em mente. A linguagem suporta operações de matriz inteiros onde compiladores podem explorar o paralelismo (especialmente em multi-core). Por exemplo,

Dense multiplicação de matrizes é simplesmente:

matmul(a,b)

L2 norma de um vetor x é:

sqrt(sum(x**2))

demonstrações Além disso, como os processos FORALL, PURE & ELEMENTAL etc. ajuda adicional para optimizar código. ponteiros mesmo em Fortran não são tão flexíveis quanto C por esta razão simples.

O próximo padrão Fortran (2008) tem co-matrizes que permite que você facilmente escrever código paralelo. G95 (open source) e compiladores de CRAY já apoiá-lo.

Então, sim Fortran pode ser rápido simplesmente porque compiladores podem otimizar / parallelize melhor do que C / C ++. Mas, novamente, como tudo na vida, há bons compiladores e compiladores ruins.

É engraçado que muitas respostas aqui de não saber as línguas. Isto é especialmente verdadeiro para programadores C / C ++ que abriram e código do Fortran 77 de idade e discutir os pontos fracos.

Suponho que a questão da velocidade é principalmente uma questão entre C / C ++ e Fortran. Em um código enorme, ele sempre depende do programador. Existem algumas características da linguagem que supera Fortran e algumas características que C faz. Então, em 2011, ninguém pode realmente dizer qual é mais rápido.

Sobre a própria linguagem, Fortran hoje suporta recursos OOP completa e é totalmente compatível. Eu tenho usado o Fortran 2003 completamente e eu diria que foi simplesmente delicioso para usá-lo. Em alguns aspectos, Fortran 2003 ainda está atrás de C ++, mas vamos olhar para o uso. Fortran é usado principalmente para computação numérica, e ninguém usa fantasia C ++ OOP apresenta por causa de razões de velocidade. Em computação de alto desempenho, C ++ tem quase nenhum lugar para ir (ter um olhar para o padrão MPI e você vai ver que C ++ foi preterido!).

Hoje em dia, você pode simplesmente fazer a programação idioma misto com Fortran e C / C ++. Há ainda interfaces para GTK + em Fortran. Há compiladores livres (gfortran, G95) e muitos excelentes comerciais.

Existem várias razões pelas quais Fortran poderia ser mais rápido. No entanto, a quantidade que importa é tão inconseqüente ou pode ser contornado de qualquer maneira, que não deve importar. A principal razão para usar Fortran hoje em dia é a manutenção ou extensão de aplicativos legados.

  • palavras-chave ELEMENTAIS PURE e em funções. Estas são funções que não têm efeitos colaterais. Isso permite otimizações em certos casos em que o compilador sabe a mesma função será chamada com os mesmos valores. Nota: implementos CCG "puro" como uma extensão para o idioma. Outros compiladores podem também. análise inter-módulo também pode executar esta otimização, mas é difícil.

  • conjunto padrão de funções que lidam com matrizes, e não elementos individuais. Coisas como sin (), log (), sqrt () tomam matrizes em vez de escalares. Isto torna mais fácil para otimizar a rotina. Auto-vetorização dá os mesmos benefícios na maioria dos casos, se estas funções são inline ou builtins

  • Builtin tipo complexo. Em teoria, isso poderia permitir que o compilador para reordenar ou eliminar certas instruções em certos casos, mas provavelmente você veria o mesmo benefício com a struct {double re, im; }; idioma usado em C. Ele torna-se um desenvolvimento mais rápido embora como operadores trabalham em tipos complexos em Fortran.

Eu acho que o ponto-chave a favor de Fortran é que ele é uma linguagem um pouco mais adequado para expressar por vectores e matemática baseada em array. A questão análise ponteiro apontado acima é real na prática, visto que o código portátil não pode realmente assumir que você pode dizer um compilador algo. Há sempre uma vantagem para computaitons expressão de uma maneira mais perto de como os olhares de domínio. C realmente não tem matrizes em tudo, se você olhar de perto, apenas algo que tipo de comporta-se como ele. Fortran tem arrawys reais. Que torna mais fácil para compilar para certos tipos de algoritmos especialmente para máquinas paralelas.

No fundo em coisas como sistema de tempo de execução e convenções de chamada, C e Fortran moderna são suficientemente semelhantes que é difícil ver o que iria fazer a diferença. Note-se que C aqui é realmente base de C: C ++ é uma questão totalmente diferente com diferentes características de desempenho.

Não existe tal coisa como uma língua ser mais rápido do que o outro, então a resposta adequada é não .

O que você realmente tem que fazer é: "é o código compilado com o compilador Fortran X mais rápido que o código equivalente compilado com compilador C Y?" A resposta a essa questão, claro, depende de qual dois compiladores que você escolher.

Outra questão poderia fazer seria ao longo das linhas de "Dada a mesma quantidade de esforço colocado em otimização em seus compiladores, que compilador iria produzir código mais rápido?" A resposta a esta seria de fato Fortran . Fortran têm vantagens certian:

  • Fortran teve que competir com as costas Assembléia no dia em que alguns jurou nunca usar compiladores, por isso ele foi projetado para a velocidade. C foi projetado para ser flexível.
  • nicho de Fortran foi o número crunching. Neste código de domínio é não rápido o suficiente. Então sempre houve muita pressão para manter a língua eficiente.
  • A maioria das pesquisas em otimizações do compilador é feito por pessoas interessadas em acelerar número Fortran trituração de código, para otimização de código Fortran é um problema muito mais conhecido do que otimizar qualquer outra linguagem compilada, e novas inovações aparecem em Fortran em primeiro lugar.
  • Biggie : C incentiva muito mais uso ponteiro do Fortran. Este drasticly aumenta o alcance potencial de qualquer item de dados em um programa C, o que os torna muito mais difícil de otimizar. Note-se que Ada também é muito melhor do que C neste reino, e é uma linguagem OO muito mais moderno do que o comumente encontrados Fortran77. Se você quiser um langauge OO que pode gerar o código mais rápido do que C, esta é uma opção para você.
  • Devido novamente para o seu nicho de trituração de número, os clientes do Fortran tendem a se preocupam mais com a otimização do que os clientes de compiladores C.

No entanto, não há nada que impeça alguém de colocar uma tonelada de esforço em otimização do seu compilador C, e tornando-se gerar um código melhor do que compilador Fortran da sua plataforma. Na verdade, as vendas maiores gerados por compiladores C torna este cenário bastante viável

Há outro item onde Fortran é diferente do C - e potencialmente mais rápido. Fortran tem melhores regras de otimização do que C. Em Fortran, a ordem de avaliação de uma expressão não é definida, o que permite que o compilador para otimizá-lo - se alguém quiser forçar uma certa ordem, tem de se usar parênteses. Em C a ordem é muito mais rigoroso, mas com opções "-Fast", eles estão mais relaxados e "(...)" também são ignorados. Acho Fortran tem uma maneira que fica bem no meio. (Bem, IEEE torna o viver mais difícil como certas mudanças de avaliação de ordem exigem que há estouros de ocorrer, o que quer tem que ser ignorada ou dificulta a avaliação).

Outra área de regras mais inteligentes são números complexos. Não só isso demorou até C 99 que C tinha, também as regras governá-los é melhor em Fortran; desde que a biblioteca Fortran de gfortran é parcialmente escrito em C, mas implementa a semântica Fortran, GCC ganhou a opção (que também pode ser usado com programas "normais" C):

-fcx-fortran-regras multiplicação complexa e divisão de seguir regras Fortran. redução de gama é feito como parte da divisão complexa, mas não há nenhuma verificação se o resultado de uma multiplicação complexa ou divisão é "NaN + I * NaN", com uma tentativa de salvar a situação, nesse caso.

O alias regras mencionado acima é um outro bônus e também - pelo menos em princípio - as operações de matriz inteira, que se tomadas em devida consideração pelo otimizador do compilador, pode levar código mais rápido. No lado contralateral são que determinada operação levar mais tempo, por exemplo se se faz uma atribuição para uma matriz allocatable, há muitas verificações necessárias (realocar [Fortran recurso 2003], tem os passos da matriz, etc?), que fazem a operação simples mais complexo nos bastidores - e, portanto, mais lento, mas torna a linguagem mais poderosa. Por outro lado, as operações de matriz com limites flexíveis e passos torna mais fácil escrever código - eo compilador é geralmente melhor otimização de código que um usuário

.

No total, acho que ambos C e Fortran sobre são igualmente rápido; a escolha deve ser mais que a linguagem faz um como mais ou se usando as operações de matriz inteira de Fortran e sua melhor portabilidade são mais úteis -. ou melhor interface com bibliotecas do sistema e do usuário da interface gráfica em C

Não há nada sobre os idiomas Fortran e C, que faz um mais rápido do que o outro para fins específicos. Há coisas sobre específica compiladores para cada uma das línguas que fazem algum favorável para certas tarefas mais do que outros.

Por muitos anos, Fortran existia o que poderia fazer magia negra para suas rotinas numéricas, fazendo muitos cálculos importantes insanamente rápido. Os compiladores C contemporâneas não poderia fazê-lo também. Como resultado, um grande número de bibliotecas de código cresceu em Fortran. Se você quiser usar esses bem testado, maduro, bibliotecas maravilhosos, você quebrar o compilador Fortran.

As minhas observações informais mostram que estes dias as pessoas código suas coisas computacional pesado em qualquer linguagem de idade, e se ele leva um tempo enquanto eles encontrar em algum cluster de computação barato. A lei de Moore faz tolos de nós todos.

I comparar a velocidade de Fortran, C, C ++ e com o índice de referência clássico Levine-Callahan-Dongarra de netlib. A versão em língua múltipla, com OpenMP, é http://sites.google.com/site/tprincesite/levine-callahan -dongarra-vectores O C é mais feio, como começou com a tradução automática, além de inserção de restringir e pragmas para certos compiladores. C ++ é apenas C com modelos STL quando aplicável. Para minha opinião, o STL é um saco misturado para saber se ele melhora a capacidade de manutenção.

Há apenas exercício mínimo da função automática em revestimento para ver até que ponto ela melhora a otimização, uma vez que os exemplos são baseados em prática Fortran tradicional, onde pouco a dependência é o lugar na in-forro.

compilador C / C ++ que tem de longe o uso mais generalizado carece de auto-vetorização, em que esses benchmarks dependem fortemente.

Re o post que veio logo antes isto: há um par de exemplos em que os parênteses são usados ??em Fortran para ditar a ordem mais rápido ou mais precisa de avaliação. compiladores C conhecidos não têm opções para observar os parênteses sem desativar otimizações mais importantes.

eu estava fazendo alguma matemática extensa, com Fortran e C para um par de anos. De minha própria experiência, posso dizer que Fortran às vezes é realmente melhor do que C, mas não pela sua velocidade (pode-se fazer C executar tão rápido quanto Fortran usando apropriado estilo de codificação), mas sim por causa de bibliotecas muito bem otimizados como LAPACK, e por causa de grande paralelização. Na minha opinião, Fortran é realmente estranho para trabalhar com, e suas vantagens não são bons o suficiente para cancelar essa desvantagem, então agora eu estou usando C + GSL para fazer cálculos.

Eu sou um programador amador e eu sou "médio" em ambas as línguas. Acho que é mais fácil de escrever código rápido Fortran de C (ou C ++) de código. Ambos Fortran e C são linguagens "históricos" (por padrão hoje), são muito utilizadas e têm suportado bem compilador livre e comercial.

Eu não sei se é um fato histórico, mas Fortran sinto que é construído para ser paralelo / distribuídas / vectorized / whatever-muitos núcleos-ized. E hoje é praticamente o "padrão métrico" quando estamos falando de velocidade: "ele escalar"

Para cpu pura trituração eu amo Fortran. Para qualquer coisa IO relacionado acho que é mais fácil trabalhar com C. (é difícil tanto em caso de qualquer maneira).

Agora, é claro, para o código intensivo matemática paralelo você provavelmente vai querer usar o seu GPU. Ambos C e Fortran tem um monte de mais ou menos bem integrado interface de CUDA / OpenCL (e agora OpenACC).

A minha resposta moderadamente objetivo é: Se você sabe tanto a linguagem igualmente bem / mal, então eu acho que Fortran é mais rápido porque acho que é mais fácil de escrever paralelo / code distribuídos em Fortran do C. (uma vez que você entender que você pode escrever "de forma livre "fortran e não apenas estrito código F77)

Aqui está uma segunda resposta para aqueles dispostos a me downvote porque eles não gostam do 1º resposta: Ambos linguagem tem as características necessárias para escrever código de alta performance. Portanto, é dependente do algoritmo que você está execução (CPU? Io intensivo? Intensivo de memória?), O hardware (single CPU? Multi-core? Distribuir supercomputador? GPGPU? FPGA?), Sua habilidade e, finalmente, o próprio compilador. Ambos C e Fortran tem compilador incrível. (I estou seriamente impressionado pela forma como avançado compiladores Fortran são mas assim que são compiladores C).

PS: Estou feliz que você excluídos especificamente libs, porque eu tenho uma grande quantidade de coisas ruins a dizer sobre libs Fortran GUI. :)

Eu não ouvi que Fortan é significativamente mais rápido do que C, mas pode ser tht concebível em certos casos, seria mais rápido. E a chave não está nos recursos de linguagem que estão presentes, mas naqueles que (geralmente) ausente.

Um exemplo são ponteiros C. ponteiros C são usados ??praticamente em todos os lugares, mas o problema com ponteiros é que o compilador normalmente não pode dizer se eles estão apontando para as diferentes partes de uma mesma matriz.

Por exemplo, se você escreveu uma rotina strcpy que ficou assim:

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

O compilador tem de trabalho sob a suposição de que o d e s pode ser sobrepostos matrizes. Portanto, não pode executar uma otimização que iria produzir resultados diferentes quando as matrizes se sobrepõem. Como seria de esperar, este restringe consideravelmente o tipo de otimizações que podem ser executadas.

[Devo observar que C99 tem um "restringir" palavra-chave que explicitamente diz que os compiladores que os ponteiros não se sobrepõem. Observe também que o Fortran também tem ponteiros, com semântica diferentes das de C, mas os ponteiros não são onipresentes como em C.]

Mas voltando à questão C vs. Fortran, é concebível que um compilador Fortran é capaz de realizar algumas otimizações que pode não ser possível para (diretamente escrita) um programa C. Então, eu não seria muito surpreso com a reivindicação. No entanto, eu espero que a diferença de desempenho não seria tanto assim. [~ 5-10%]

As diferenças de velocidade entre Fortran e C será mais uma função de otimizações do compilador e da biblioteca de matemática subjacente usado pelo compilador particular. Não há nada intrínseco ao Fortran que tornaria mais rápido que C.

De qualquer forma, um bom programador pode escrever Fortran em qualquer idioma.

Rápido e simples: Ambos são igualmente rápido, mas Fortran é mais simples. O que é realmente mais rápido no final depende do algoritmo, mas há uma considerável diferença de velocidade de qualquer maneira. Isto é o que eu aprendi em uma oficina Fortran de alto desempenho de computação centro Stuttgard, Alemanha, em 2015. Eu trabalho tanto com Fortran e C e partilhar esta opinião.

Explicação:

C foi projetado para sistemas operacionais de gravação. Por isso, tem mais liberdade do que o necessário para escrever código de alta performance. Em geral, isso não é problema, mas se ainda não programm com cuidado, pode-se facilmente retardar o baixo código.

Fortran foi projetado para programação científica. Por esta razão, ele suporta escrever código rápido sintaxe-sábio, pois este é o principal objetivo do Fortran. Em contraste com a opinião pública, Fortran não é uma linguagem de programação desatualizado. Sua mais recente padrão é 2010 e os novos compiladores são publicados em uma base regular, como a maioria de código de alto desempenho é escrito em Fortran. Fortran ainda suporta recursos modernos como diretivas de compilador (em pragmas C).

Exemplo: Queremos dar uma grande estrutura como um argumento de entrada para uma função (Fortran: subroutine). Dentro da função o argumento não é alterada.

C suporta tanto, chamada por referência e por valor, que é um recurso útil. No nosso caso, o poder programador pela chamada utilização acidente por valor. Isso retarda consideravelmente as coisas, como as necessidades struct a ser copiada na memória dentro em primeiro lugar.

Fortran trabalha com chamada única referência, o que obriga o programador para copiar a estrutura à mão, se ele realmente quer uma chamada operação de valor. No nosso caso, fortran será automaticamente tão rápido quanto a versão C com chamada por referência.

Geralmente Fortran é mais lento do que C. C pode utilizar ponteiros nível de hardware que permitem que o programador mão-optimize. O Fortran (na maioria dos casos) não tem acesso à memória hardware abordar hacks. (VAX FORTRAN é outra história.) Eu usei Fortran e fora desde os anos 70. (Realmente.)

No entanto, a partir do 90 de Fortran evoluiu para incluir construções de linguagem específicos que podem ser otimizados em algoritmos inerentemente paralelas que pode realmente gritam em um processador multi-core. Por exemplo, automático Vetorizar permite múltiplos processadores para lidar com cada elemento num vector de dados simultaneamente. 16 processadores - 16 elemento vetor - transformação for 1/16 o tempo

.

Em C, você tem que gerenciar seus próprios tópicos e projetar seu algoritmo cuidadosamente para multi-processamento, e, em seguida, usar um monte de chamadas de API para se certificar de que o paralelismo acontece corretamente.

Em FORTRAN, você só tem que projetar seu algoritmo cuidadosamente para multi-processamento. O compilador e tempo de execução pode lidar com o resto para você.

Você pode ler um pouco sobre High Performance Fortran, mas você encontrar um monte de links mortos. Você é melhor fora de ler sobre Programação Paralela (como OpenMP.org ) e como suportes Fortran isso.

O código mais rápido não é realmente até a língua, é o compilador que você possa ver o ms-vb "compilador" que gera inchado, mais lento e código de objeto redundante que é amarrado em conjunto dentro de um ".exe", mas PowerBASIC gera código muito melhor. código objecto feito por um C e compiladores C ++ é gerado em algumas fases (pelo menos 2), mas pelo design compiladores mais Fortran ter pelo menos 5 fases, incluindo a optimizações de alto nível para que por concepção Fortran sempre têm a capacidade de gerar um código altamente optimizado. Assim, no final é o compilador não o idioma que você deve pedir, o melhor compilador que eu sei é o Intel Fortran Compiler porque você pode obtê-lo no Linux e Windows e você pode usar VS como o IDE, se você está procurando um barato tigh compilador você sempre pode retransmitir em OpenWatcom.

Mais informações sobre isso: http://ed-thelen.org/1401Project/1401-IBM -Systems-Journal-FORTRAN.html

Fortran tem melhor I / O rotinas, por exemplo, a facilidade de fazer implícita dá flexibilidade que biblioteca padrão do C não pode igualar.

O compilador Fortran lida diretamente o mais complexo sintaxe envolvido, e como tal sintaxe não pode ser facilmente reduzida ao argumento passando forma, C não pode implementá-lo de forma eficiente.

Usando padrões modernos e compilador, não!

Algumas das pessoas aqui têm sugerido que Fortran é mais rápido porque o compilador não precisa se preocupar com aliasing (e, portanto, pode fazer mais suposições durante optimization). No entanto, este tem sido tratado em C desde o C99 (eu acho) padrão, com a inclusão do restringir palavra-chave. Que basicamente diz ao compilador, que dentro de um escopo de dar, o ponteiro não é alias. Além disso C permite aritmética de ponteiro apropriado, onde as coisas como aliasing pode ser muito útil em termos de desempenho e alocação de recursos. Embora eu acho que a versão mais recente do Fortran permitir o uso de ponteiros "bom".

Para implementações modernas C Supera gerais Fortran (embora seja muito rápido também).

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

EDIT:

Uma feira de crítica a esse parece ser que a avaliação comparativa pode ser tendenciosa. Aqui é outra fonte (em relação ao C) que coloca resultar em mais contexto:

http://julialang.org/benchmarks/

Você pode ver que C normalmente supera Fortran na maioria dos casos (ver novamente críticas abaixo que se aplicam aqui também); como os outros, o benchmarking é uma ciência inexata que pode ser facilmente carregado para favorecer uma língua sobre os outros. Mas isso não colocar em contexto como Fortran e C têm desempenho similar.

Fortran pode lidar com matriz, especialmente matrizes multidimensionais, muito convenientemente. Cortando elementos de matriz multidimensional em Fortran pode ser muito mais fácil do que em C / C ++. C ++ agora tem as bibliotecas podem fazer o trabalho, tais como aumentar ou Eigen, mas eles estão atrás de todas as bibliotecas externas. Em Fortran estas funções são intrínseca.

Se Fortran é mais rápido ou mais conveniente para o desenvolvimento depende em grande parte o trabalho que você precisa para terminar. Como uma pessoa computação científica para a geofísica, eu fiz mais de computação em Fortran (I média moderna Fortran,> = F90).

Este é mais do que um pouco subjetivo, porque ele entra na qualidade de compiladores e tal mais do que qualquer outra coisa. No entanto, para responder mais diretamente a sua pergunta, falando de uma linguagem ponto de vista / compilador não há nada sobre Fortran sobre C que vai torná-lo inerentemente mais rápido ou melhor do que C. Se você estiver fazendo operações matemáticas pesadas, ele vai descer para o qualidade do compilador, a habilidade do programador em cada língua e as bibliotecas de suporte de matemática intrínsecas que suportam essas operações para finalmente determinar qual vai ser mais rápido para uma determinada aplicação.

EDIT: Outras pessoas, como @Nils têm levantado a questão sobre a diferença no uso de ponteiros em C e a possibilidade de aliasing que talvez faz mais implementações ingênuas mais lentas em C. No entanto, existem maneiras de lidar com boa que no C99, através de opções de otimização do compilador e / ou na forma como o C é realmente escrito. Isso é bem coberto em @Nils resposta e os comentários subseqüentes que seguem em sua resposta.

A maioria das mensagens já presentes argumentos convincentes, por isso vou apenas adicionar os proverbiais 2 centavos a um aspecto diferente.

Sendo Fortran mais rápido ou mais lento em termos de poder de processamento, no final, pode ter sua importância, mas se demorar 5 vezes mais tempo para desenvolver algo em Fortran porque:

  • falta-lhe qualquer biblioteca bom para tarefas diferentes a partir do número puro esmagando
  • que não têm qualquer ferramenta decente para documentação e teste de unidade
  • é uma língua com muito pouca expressividade, subindo rapidamente o número de linhas de código.
  • que tem um muito mau manuseio de cordas
  • que tem uma quantidade inane de questões entre os diferentes compiladores e arquiteturas te deixando louco.
  • que tem uma estratégia muito pobre IO (leitura / gravação de arquivos sequenciais. Sim, existem arquivos de acesso aleatório, mas você nunca vê-los usado?)
  • não incentivar boas práticas de desenvolvimento, modularização.
  • efetiva falta de um compilador de código aberto totalmente standard, totalmente compatível (ambos gfortran e G95 não suportam tudo)
  • muito pobre interoperabilidade com C (desconfiguração:. Um sublinhado, dois sublinhados, não sublinhado, em um sublinhado geral, mas dois se há outra sublinhado e deixar apenas não mergulhar em blocos COMUNS ...)

Então a questão é irrelevante. Se algo é lento, na maioria das vezes você não pode melhorá-lo para além de um determinado limite. Se você quiser algo mais rápido, alterar o algoritmo. No final, tempo de computador é barato. tempo humano não é. Valorizar a escolha que reduz o tempo humano. Se aumenta o tempo de computador, é o custo de qualquer maneira eficaz.

Fortran tradicionalmente não definir opções como -fp: estrita (que ifort requer para ativar alguns dos recursos em uso IEEE_arithmetic, uma parte do F2003 standard). Intel C ++ também não -fp set: estritas como um padrão, mas que é necessário para a manipulação ERRNO, por exemplo, e outros compiladores C ++ não torná-lo conveniente para desligar ErrNo ou ganho otimizações como a redução SIMD. gcc e g ++ me necessário para configurar Makefile para evitar o uso da perigosa combinação O3 -ffast-matemática -fopenmp -march = native. Para além destas questões, esta pergunta sobre o desempenho em relação fica mais nit-exigente e dependente de regras locais sobre escolha de compiladores e opções.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top