Мысленное сравнение начинается с функции, возвращающей объединение ошибки и полезного значения. Один вариант использует try, чтобы передать ошибку вызывающему коду. Предположительно более быстрый вариант подставляет catch unreachable. Первое подозрение у меня такое, что предмет эксперимента изменился.
Второй вариант утверждает, что сбой невозможен. Если он всё же случится, сборки с проверками безопасности могут аварийно завершиться. Обязанность вернуть эту ошибку убрана, поэтому само измерение двух записей ещё не даст стоимости эквивалентного поведения.
Сначала я бы сравнил распространение ошибки с явной веткой, возвращающей ту же ошибку. Обоим вариантам нужны одинаковые входные данные, работа с успешным значением, владение выделенной памятью и обработка на стороне вызывающего кода. Успешные операции стоит отделить от намеренно вызванных сбоев, затем добавить смешанную нагрузку с зафиксированной частотой ошибок. Подготовку следует вынести за пределы измеряемого участка, если она не входит в заявленную нагрузку. Нужно записать версию компилятора, режим сборки, целевую платформу, состояние машины и провести достаточно повторов, чтобы увидеть разброс.
Отдельный опыт только с успешными операциями мог бы включать catch unreachable, если указанное предусловие исключает все относящиеся к делу ошибки для этих входов. Вывод останется в пределах этого предусловия. Изучение сгенерированного кода могло бы объяснить будущий результат, но не заменить его.
Такое сравнение имеет смысл провести. Результатов пока нет.