Na seção de tipos dos documentos, é mencionado que
O operador :: pode ser usado para anexar anotações de tipo a expressões e variáveis em programas. Existem duas razões principais para fazer isso:
- Como uma afirmação para ajudar a confirmar se o seu programa funciona da maneira esperada,
- Para fornecer informações extras de tipo ao compilador, o que pode melhorar o desempenho em alguns casos
No entanto, não consigo encontrar onde estão as menções em quais "casos" especificamente as anotações de tipo ajudam a melhorar o desempenho.
Surpreendentemente, mais tarde menciona na seção de dicas de desempenho
A anotação de tipo não melhorará (e poderá até prejudicar) o desempenho se o tipo for abstrato ou construído em tempo de execução.
Não discute exaustivamente os casos em que isso realmente prejudicaria o desempenho para que possam ser evitados.
Eu estava procurando uma resposta para a pergunta do título na documentação. Apesar de serem legais, agora estou ainda mais confuso. Existem regras simples a serem seguidas sobre quando ou não anotar tipos para os três casos do título?
Como argumento de função você anota para asserção ou para implementar despacho múltiplo, mas não para performances.
O mesmo em geral para anotação de variáveis, exceto um caso específico que são membros de struct, onde a anotação de todos os membros fará uma grande diferença.
Apenas um caso importante que não foi abordado por Antonello.
O caso em que a anotação de tipo ajuda é quando o tipo não pode ser deduzido em tempo de compilação. Aqui está um exemplo:
O que você vê aqui é o fato de que quando escrevemos
v::Int = x[i]
o código dentro do loop é do tipo estável. Quando escrevemos,v = x[i]
o código não é de tipo estável e causa alocações.Você pode então perguntar por que
sum1
(not type stable) é mais rápido quesum2
(type stable). A razão é que quando escrevemosv::Int = x[i]
não é apenas uma afirmação de tipo. Na verdade, é um requisito de conversão de tipo; por exemplo, sex[i]
fosseBool
, seria convertido paraInt
. O fato de a conversão ser tentada também custa caro. O custo de conversão das funçõesf1
ef2
é muito menor que o overhead causado pelas operações em valores instáveis do tipo. Mas nas funçõessum1
esum2
o oposto é verdadeiro.Em resumo - as coisas não são óbvias (e podem até mudar nas versões de Julia). É por isso que o Manual Julia não pode fornecer uma regra precisa.
Além disso, o que é relevante saber é que: