As frequentemente conhecidas como likely
e unlikely
macros ajudam o compilador a saber se uma entrada if
geralmente será inserida ou ignorada. Usá-lo resulta em algumas melhorias (um pouco menores) no desempenho.
Comecei a usá-los recentemente e não sei com que frequência essas dicas devem ser usadas. Atualmente, eu o uso com a verificação de erros if
s, que geralmente são marcados como unlikely
. Por exemplo:
mem = malloc(size);
if (unlikely(mem == NULL))
goto exit_no_mem;
Parece bom, mas as checagens de erros if
ocorrem com bastante frequência e, conseqüentemente, o uso das macros mencionadas.
Minha pergunta é: é demais ter likely
e unlikely
macros em todas as verificações de erros if
?
Enquanto estamos nisso, que outros lugares são usados com frequência?
No meu uso atual, está em uma biblioteca que faz uma abstração do subsistema em tempo real, para que os programas se tornem portáteis entre RTAI, QNX e outros. Dito isto, a maioria das funções é pequena e chama diretamente uma ou duas outras funções. Muitas são até static inline
funções.
Portanto, antes de tudo, não é um aplicativo que eu possa criar um perfil. Não faz sentido "identificar gargalos", pois é uma biblioteca, não um aplicativo independente.
Segundo, é mais ou menos como "eu sei que isso é improvável, é melhor dizer ao compilador". Eu não tento ativamente otimizar o if
.
likely
e unlikely
existe e o que eles fazem. Não encontrei nada que realmente sugerisse quando e onde é melhor usá-los.