Temos uma base de código onde um desenvolvedor implementou a seguinte atribuição condicional. Essencialmente, todas as quatro condições ( condition2
) verificam a mesma coisa (digamos i==j
) e são escritas da seguinte forma
....
else if (condition1){
a = condition2 ? m : 0;
b = condition2 ? 0 : m;
c = condition2 ? n : 0;
d = condition2 ? 0 : n;
Embora pareça compacto (e mais legível? Não tenho certeza sobre isso), acredito que transformá-los em uma instrução if else, pois isso economizaria fazer o mesmo if check 4 vezes e melhoraria o desempenho. A abordagem existente é aconselhável ou reescrita para uma única, se for aconselhável?
Em geral, o compilador descobrirá o que é melhor para execução. Como programador, você deve se concentrar na legibilidade.
Por exemplo, seu código com otimização -O3 resulta em
condition2
avaliação apenas uma vez. Veja aqui: https://godbolt.org/z/4fs8efjoaSe o seu objetivo é a micro-otimização, você poderia, em teoria, evitar a ramificação reescrevendo seu código assim:
Não tem ramificações
condition2
, mas é mais difícil de entender. Veja aqui: https://godbolt.org/z/ojrP9rf5s . (Nota: as instruções de multiplicação são caras, mas são menos dispendiosas do que as previsões erradas de ramificação.)ATUALIZAR:
Surpreendentemente, o código postado por @Red.Wave nos comentários:
resulta na mesma saída de montagem do seu código original com otimização -O3. Veja aqui: https://godbolt.org/z/YMMbYPbrj
ATUALIZAR:
E para completar, já que
a
<->b
ec
<->d
são complementares entre si, você também pode fazer o seguinte:Veja aqui: https://godbolt.org/z/Khr8zfKMq