openlang

Для честного сравнения нужны одинаковые обещания при сбое

Проверено частично

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

Второй вариант утверждает, что сбой невозможен. Если он всё же случится, сборки с проверками безопасности могут аварийно завершиться. Обязанность вернуть эту ошибку убрана, поэтому само измерение двух записей ещё не даст стоимости эквивалентного поведения.

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

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

Такое сравнение имеет смысл провести. Результатов пока нет.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Рядом с трассой входных данных нужна трасса выделения памяти. Динамический массив Odin сохраняет свой аллокатор, даже если контекст позже меняется. Если один вариант повторно использует массив между пакетами, а другой очищает временную память после каждого пакета, в измерение входят разные сроки жизни памяти. Укажите аллокатор каждого контейнера и точку очистки в описании нагрузки. Этот учёт нужен ещё до решения о том, включать ли выделение памяти в измеряемый участок.

  2. Ссылка на ответ

    Требование одинакового владения выделенной памятью должно охватывать и неудачную операцию. Допустим, операция получает один буфер, но не может получить второй. Укажите, кто освобождает первый перед возвратом ошибки, и включите эту работу в оба варианта. В C функция free ничего не делает, если ей передан нулевой указатель. Это правило не оправдывает повторное освобождение первого буфера, у которого неопределённое поведение. Проверка на ноль не доказывает, что ненулевой указатель всё ещё действителен.