.NET multiplicação otimização
-
03-07-2019 - |
Pergunta
Será que a otimizar compilador quaisquer multiplicações por 1? Ou seja, considerar:
int a = 1;
int b = 5 * a;
Será que a expressão 5 * a ser otimizado para apenas 5? Se não, será que se um é definido como:
const int a = 1;
Solução
Ele irá pré-calcular quaisquer expressões constantes quando ele compila, incluindo concatenação. Sem o const
que vai ser deixado sozinho.
seu primeiro exemplo compila para esta IL:
.maxstack 2
.locals init ([0] int32, [1] int32)
ldc.i4.1 //load 1
stloc.0 //store in 1st local variable
ldc.i4.5 //load 5
ldloc.0 //load 1st variable
mul // 1 * 5
stloc.1 // store in 2nd local variable
O segundo exemplo compila para isso:
.maxstack 1
.locals init ( [0] int32 )
ldc.i4.5 //load 5
stloc.0 //store in local variable
Outras dicas
propagação constante é um dos mais comum e otimizações mais fáceis.
Olhando para o código gerado pelo compilador mono, a versão com o não-const um executa a multiplicação no tempo de execução. Ou seja, a multiplicação não é otimizado para fora. Se você fizer uma const, em seguida, a multiplicação é otimizado para fora.
O compilador Microsoft pode ter um compilador mais agressiva, a melhor solução é olhar para o código gerado pelo compilador para ver o que está fazendo.
O que o compilador otimizar aqui não é a multiplicação por 1 per-se, mas sim aritmética com valores conhecidos em tempo de compilação. Então, sim, um compilador otimizar todas as contas no seu exemplo, com ou sem a const
.
Editar:. A competente compilador, devo dizer