Me deparei com este exemplo recentemente:
Se 999 vezes fora de 1.000, uma exceção não será lançada, a exceção será gerada apenas uma vez. Por outro lado, uma condicional teria sido chamada desnecessariamente 999 vezes, portanto, neste caso, a exceção é superior.
Nesse caso, é C #, mas, de um modo geral, isso é verdade? Eu já havia assumido que as instruções try / catch tinham uma sobrecarga própria que seria igual ao tempo gasto no processamento de uma condição.
É verdade que apenas lançar blocos try / catch em qualquer lugar que normalmente seria condicional seria uma maneira terrível de codificar, mas em termos de recursos essa declaração se mantém?
design
object-oriented
Jane Panda
fonte
fonte
Respostas:
Geralmente é verdade para compiladores de qualidade comercial. No entanto, condicionais podem alcançar eficiências semelhantes usando
assume(false)
anotações de estilo. A otimização guiada por perfil pode superar os dois.A razão subjacente é que bons compiladores podem gerar código mais eficiente, fazendo suposições corretas sobre a probabilidade de execução do código. Como a convenção é que as exceções são excepcionais, a maioria dos compiladores (na ausência de dados de criação de perfil) gera código ideal quando as exceções são realmente raras.
Por exemplo, o código de tratamento de exceções pode ser colocado em seu próprio segmento e somente ser paginado quando a primeira exceção ocorrer. Isso significa que o cache da CPU pode ser usado com mais eficiência, armazenando apenas código não excepcional.
fonte
Existem cenários para usar try / catch e outros para usar condicionais.
Usar uma tentativa / captura não prejudica o desempenho, conforme descrito extensivamente aqui
Além do desempenho, o tratamento adequado de exceções é importante. A última coisa que você deseja é que erros não detectados sejam mostrados a um usuário, desempenho de buggy ou aplicativo travado após a ocorrência de um problema.
fonte
Um exemplo de um melhor desempenho usando try / catch em vez de condicional é quando se lida com Dicionários, quando se pergunta se a chave contém O (n), em vez de apenas tentar acessar / adicionar a chave e capturar a exceção em potencial.
fonte