Diferença de desempenho entre correspondência de padrões e if-else
Por que o OCaml pode gerar código de máquina eficiente para a correspondência de padrões e não para testes if-else?
Eu estava lendo OCaml do mundo real e me depareiesta seção onde eles compararam o desempenho da correspondência de padrões com o desempenho dos testes if-else. Verificou-se que a correspondência de padrões no exemplo deles era significativamente mais rápida que os testes if-else. Mesmo que o código não utilize nenhum caso de correspondência de padrão especial que não seria possível com testes if-else, ele apenas compara números inteiros.
Eles atribuem a otimização do compilador à correspondência de padrões como o motivo da diferença de desempenho. O compilador seria capaz de gerar código de máquina que salta diretamente do caso correspondente com base em um conjunto de verificações de tempo de execução eficientemente escolhido.
Eu entendo isso, mas realmente não vejo por que o compilador não é capaz de fazer a mesma coisa nos testes if-else. Afinal, o código está apenas comparando números inteiros com números inteiros. Isso ocorre porque o OCaml ainda não otimizou os testes if-else ou porque é impossível otimizar os testes if-else como é possível com a correspondência de padrões?
O código de correspondência de padrões é assim:
let plus_one_match x =
match x with
| 0 -> 1
| 1 -> 2
| 2 -> 3
| _ -> x + 1
O código if-else fica assim:
let plus_one_if x =
if x = 0 then 1
else if x = 1 then 2
else if x = 2 then 3
else x + 1