Importante!
Bem, com base nisso, temos outro aprendizado importante.
Se os operadores de Curto Circuito não precisam fazer todas as verificações para a tomada de decisão, devemos colocar sempre como primeiras condições do “IF/While...” as mais leve, que terão menos processamento, acesso a dados...
Observe:
Solução 1:
if ((ViagemDocumento.ExistsByDocumentoLogistica(this.Handle, considerarCancelados: false)) &&
(this.TipoLotacao.Handle == eTipoLotacao.Fracionado.Index))
{
...
}
Na solução 1, mesmo que o TipoLotacao seja diferente de Fracionado o sistema faria o acesso ao banco de dados para verificar a existência de documentos (ExistsByDocumentoLogistica).
Digamos, que o sistema gaste:
10ms para (this.TipoLotacao.Handle == eTipoLotacao.Fracionado.Index))
200ms ((ViagemDocumento.ExistsByDocumentoLogistica(this.Handle, considerarCancelados: false)
A simples troca de ordem, manteria a expressão válida, porém o sistema passa realizar o acesso ao banco apenas quando a primeira expressão for verdadeira, ou seja, TipoLotacao igual a Fracionado.
Quando o TipoLotacao for Lotação, nem precisa realizar o acesso ao banco, pois a primeira expressão não é válida.
Solução 2:
if ((this.TipoLotacao.Handle == eTipoLotacao.Fracionado.Index) &&
(ViagemDocumento.ExistsByDocumentoLogistica(this.Handle, considerarCancelados: false)))
{
....
}
Na solução 1, o sistema sempre gastaria seus 200ms para verificação da primeira condição, e em alguns casos +10ms para a segunda condição
Já na solução 2, o sistema gastaria 10ms para verificação da primeira condição, e em alguns casos +200ms.
Se consideramos que 50% dos documentos é fracionado e os outros 50% lotação processando 1000 documentos teríamos:
Tempo por Documento:
Solução 1 Solução 2
Doc Fracionado 210 210
Doc Lotação 200 10
Tempo para os 1000 documentos:
Solução 1 Solução 2
500 Docs Fracionado 105.000 105.000
500 Docs Lotação 100.000 5.000
Total 1000 Docs: 205.000 110.000
Ou seja, se executássemos essa expressão 1000 vezes dentro das condições acima, a solução 1 levaria 205 segundos e a solução 2 levaria 110 segundos.
A solução 2 executaria praticamente na metade do tempo da solução 1.
Essas simples trocas e avaliações sobre o que deve ser verificado primeiro pode trazer ganhos significativos de performance no sistema.
Para Saber Mais:
http://msdn.microsoft.com/en-us/library/6a71f45d.aspx