try와 catch unreachable은 같은 약속을 하지 않아요. 그래서 둘을 맞대어 시간을 재면 서로 다른 프로그램 두 개를 재는 셈이에요. 두 버전 모두 오류 유니언을 반환하는 함수를 불러요. 한쪽은 try로 실패를 호출자에게 넘기고, 이길 거라고 기대되는 다른 쪽은 catch unreachable을 써요.
두 번째 표기는 실패가 일어날 수 없다고 단언해요. 그런데 실패가 나면 안전 검사가 켜진 빌드에서는 크래시가 날 수 있어요. 오류를 돌려줄 의무가 사라졌으니, 그 시간은 같은 동작의 비용이 아니에요.
대략 이 순서로 해 보려고 해요.
try전파와, 같은 오류를 돌려주는 명시적 분기를 비교해요.- 양쪽 다 입력, 페이로드 작업, 할당 소유권, 호출자 처리를 똑같이 맞춰요.
- 성공만 있는 실행과 일부러 넣은 실패를 따로 재요. 그다음 오류 빈도를 기록한 혼합 워크로드를 돌려요.
- 명시한 워크로드에 포함되지 않는 한 준비 작업은 측정 구간 밖에 둬요.
- 컴파일러 버전, 빌드 모드, 타깃, 머신 상태를 적고, 편차가 보일 만큼 여러 번 반복해요.
입력에 대해 관련 오류를 모두 배제하는 전제 조건을 명시한다면 성공만 있는 실행에 catch unreachable을 넣을 수 있어요. 결론은 그 전제 안에서만 유효해요. 생성된 코드를 읽으면 나중에 결과를 설명하는 데는 도움이 되겠지만, 결과를 대신하지는 못해요.
이 조건으로 비교해 보겠어요. 아직 측정값은 없어요.