Usando funções virtuais em vez de instruções IF é mais rápido?

Lembro-me de ler on-line em algum lugar que, em situações de latência extremamente baixa, é melhor usar funções virtuais como substituto de instruções IF.

Isso é verdade? Eles estão basicamente dizendo que o polymorphism dynamic é melhor para situações de velocidade?

Algum usuário tem alguma outra “quirks” de baixa latência do C ++ que possam compartilhar?

Eu duvido muito que uma única instrução if / else seja mais lenta do que usar uma function virtual: a function virtual normalmente impõe uma parada no pipeline e limita as oportunidades de otimização. Uma instrução if pode atrasar o pipeline, mas se for executada com frequência, a previsão pode seguir o caminho certo. No entanto, se a sua alternativa estiver entre uma cascata de poucas instruções if / else versus apenas uma chamada de function virtual, essa última pode ser mais rápida. Além disso, se o código total que está sendo executado através do uso de funções virtuais vs. ramificações for diferente, as funções acabam sendo substancialmente menores, o que pode causar poucas falhas de cache no cache de instruções. Isto é, depende da situação. A melhor maneira é medir. Observe que a medição de código artificial que está apenas tentando investigar a diferença entre duas abordagens, mas não realiza nenhum processamento, produz resultados enganosos. No entanto, quando você precisa produzir um código de latência muito baixo, normalmente pode gastar mais tempo para desenvolvê-lo, ou seja, experimentar várias abordagens diferentes pode ser viável.

Embora meus colegas tendam a desaprovar minhas abordagens de modelo para evitar a ramificação em tempo de execução, o código que acabo obtendo com frequência é muito lento para compilar, mas muito rápido para ser executado. Naturalmente, isso depende das funções ou ramificações usadas para serem conhecidas em tempo de compilation. Nas áreas que usei, por exemplo, para processamento de mensagens, geralmente é suficiente ter uma decisão dinâmica, por exemplo, uma para cada mensagem (ou seja, uma chamada de function virtual), seguida de processamento que não envolve nenhum tipo dynamic (ainda são condicionais, por exemplo, para a quantidade de valores em uma tabela).