Разница в производительности между сопоставлением с образцом и if-else

Почему OCaml может генерировать эффективный машинный код для сопоставления с образцом, а не для тестов if-else?

Я читал Real World OCaml, и я столкнулсяэтот раздел, где они сравнивали производительность сопоставления с образцом с производительностью тестов if-else. Оказалось, что сопоставление с образцом в их примере было значительно быстрее, чем тесты if-else. Несмотря на то, что в коде не используются какие-либо особые случаи сопоставления с образцом, которые были бы невозможны с помощью тестов if-else, он просто сравнивает целые числа.

Они приписывают оптимизацию компилятора для сопоставления с образцом как причину разницы в производительности. Компилятор сможет генерировать машинный код, который напрямую переходит в соответствующий регистр, на основе эффективно выбранного набора проверок во время выполнения.

Я понимаю это, но я не понимаю, почему компилятор не может сделать то же самое для тестов if-else. В конце концов, код просто сравнивает целые числа с целыми числами. Это потому, что OCaml еще не оптимизировал тесты if-else, или это потому, что невозможно оптимизировать тесты if-else, как это возможно при сопоставлении с образцом?

Код соответствия шаблону выглядит следующим образом:

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

Код if-else выглядит так:

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

Ответы на вопрос(2)

Ваш ответ на вопрос