Leistungsunterschied zwischen Pattern Matching und If-else

Warum kann OCaml effizienten Maschinencode für den Mustervergleich und nicht für If-else-Tests generieren?

Ich habe Real World OCaml gelesen und bin auf @ gestoßDie Abschnitt, in dem die Leistung des Mustervergleichs mit der Leistung der If-else-Tests verglichen wurde. Es stellte sich heraus, dass die Musterübereinstimmung in ihrem Beispiel erheblich schneller war als bei anderen Tests. Obwohl der Code keine speziellen Musterübereinstimmungsfälle verwendet, die mit if-else-Tests nicht möglich wären, werden nur ganze Zahlen verglichen.

Sie schreiben die Compiler-Optimierung für den Mustervergleich als Grund für den Leistungsunterschied zu. Der Compiler wäre in der Lage, Maschinencode zu generieren, der auf der Grundlage einer effizient ausgewählten Reihe von Laufzeitprüfungen direkt in den übereinstimmenden Fall springt.

Ich verstehe das, aber ich verstehe nicht wirklich, warum der Compiler nicht in der Lage ist, dasselbe für die if-else-Tests zu tun. Schließlich vergleicht der Code nur ganze Zahlen mit ganzen Zahlen. Liegt das daran, dass OCaml if-else-Tests (noch) nicht optimiert hat, oder liegt es daran, dass es unmöglich ist, if-else-Tests zu optimieren, wie dies mit Pattern Matching möglich ist?

Der Mustervergleichscode sieht folgendermaßen aus:

let plus_one_match x =
    match x with
    | 0 -> 1
    | 1 -> 2
    | 2 -> 3
    | _ -> x + 1

Der if-else-Code sieht folgendermaßen aus:

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