Pergunta

Você normalmente configura seu compilador para otimizar a velocidade máxima ou o menor tamanho de código?ou você define manualmente as configurações de otimização individuais?Por que?

Percebo que na maioria das vezes as pessoas tendem a deixar as configurações de otimização do compilador em seu estado padrão, o que com visual c++ significa velocidade máxima.Sempre achei que as configurações padrão tinham mais a ver com a boa aparência nos benchmarks, que tendem a ser programas pequenos que cabem inteiramente no cache L2 do que com o melhor desempenho geral, então normalmente defino-os para otimizar para o menor tamanho.

Foi útil?

Solução

Como usuário do Gentoo eu tentei algumas otimizações no sistema operacional completo e houve discussões intermináveis ​​sobre o Fóruns Gentoo sobre isso.Algumas boas bandeiras para o GCC podem ser encontradas no wiki.

Resumindo, a otimização do tamanho funcionou melhor em um laptop Pentium3 antigo com memória RAM limitada, mas em minha máquina desktop principal com Core2Duo, -O2 deu melhores resultados no geral.

Há também um roteiro pequeno se você estiver interessado nos sinalizadores específicos x86 (32 bits) que são mais otimizados.

Se você usa o gcc e realmente deseja otimizar um aplicativo específico, tente ACOVEA.Ele executa um conjunto de benchmarks e depois os recompila com todas as combinações possíveis de sinalizadores de compilação.Há um exemplo usando a codificação Huffman no site (quanto menor, melhor):

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(Observe que ele descobriu que -Os é o mais lento neste sistema Opteron.)

Outras dicas

Eu prefiro usar tamanho mínimo.A memória pode ser barata, cache não é.

Além do fato de que a localização do cache é importante (como disse On Freund), outra coisa que a Microsoft faz é criar um perfil de seu aplicativo e descobrir quais caminhos de código são executados durante os primeiros segundos de inicialização.Depois disso, eles devolvem esses dados ao compilador e pedem que ele coloque as partes que são executadas durante a inicialização juntas.Isso resulta em um tempo de inicialização mais rápido.

Acredito que esta técnica esteja disponível publicamente no VS, mas não tenho 100% de certeza.

Para mim, depende da plataforma que estou usando.Para algumas plataformas embarcadas ou quando trabalhei no processador Cell, você tem restrições como cache muito pequeno ou espaço mínimo fornecido para código.

Eu uso o GCC e costumo deixá-lo em "-O2", que é o nível "mais seguro" de otimização e favorece a velocidade em relação a um tamanho mínimo.

Eu diria que provavelmente não faz muita diferença, a menos que você esteja desenvolvendo um aplicativo de alto desempenho. Nesse caso, você provavelmente deveria avaliar as várias opções para seu caso de uso específico.

A Microsoft envia todos os seus softwares C/C++ otimizados para tamanho.Após o benchmarking, eles descobriram que ele realmente oferece melhor velocidade (devido à localidade do cache).

Existem muitos tipos de otimização, velocidade máxima versus código pequeno é apenas um.Nesse caso, eu escolheria a velocidade máxima, pois o executável será um pouco maior.Por outro lado, você poderia otimizar seu aplicativo para um tipo específico de processador.Em alguns casos isto é uma boa ideia (se você pretende rodar o programa apenas na sua estação), mas neste caso é provável que o programa não funcione em outra arquitetura (ex.:você compila seu programa para funcionar em uma máquina Pentium 4 -> provavelmente não funcionará em um Pentium 3).

Crie ambos, crie um perfil e escolha o que funciona melhor em um projeto e hardware específico.

Isto é, para código crítico de desempenho - caso contrário, escolha qualquer um e não se preocupe.

Sempre usamos maximizar para velocidade ideal, mas todo o código que escrevo em C++ está de alguma forma relacionado a algoritmos de bioinformática e a velocidade é crucial enquanto o tamanho do código é relativamente pequeno.

A memória é barata hoje em dia :) Portanto, pode ser significativo definir as configurações do compilador para a velocidade máxima, a menos que você trabalhe com sistemas embarcados.É claro que a resposta depende da situação concreta.

Isso depende da aplicação do seu programa.Ao programar uma aplicação para controlar um processo industrial rápido, faria sentido otimizar a velocidade.Ao programar um aplicativo que só precisa reagir à entrada do usuário, a otimização do tamanho pode fazer sentido.Isto é, se você estiver preocupado com o tamanho do seu executável.

Ajustar as configurações do compilador dessa forma é uma otimização.Partindo do princípio de que "a otimização prematura é a raiz de todos os males", não me preocupo com isso até que o programa esteja próximo de seu estado final de envio e eu descubra que ele não é rápido o suficiente - ou seja,quase nunca.

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