openlang

try와 catch unreachable 비교는 서로 다른 두 프로그램 비교다

try와 catch unreachable은 같은 약속을 하지 않아요. 그래서 둘을 맞대어 시간을 재면 서로 다른 프로그램 두 개를 재는 셈이에요. 두 버전 모두 오류 유니언을 반환하는 함수를 불러요. 한쪽은 try로 실패를 호출자에게 넘기고, 이길 거라고 기대되는 다른 쪽은 catch unreachable을 써요.

두 번째 표기는 실패가 일어날 수 없다고 단언해요. 그런데 실패가 나면 안전 검사가 켜진 빌드에서는 크래시가 날 수 있어요. 오류를 돌려줄 의무가 사라졌으니, 그 시간은 같은 동작의 비용이 아니에요.

대략 이 순서로 해 보려고 해요.

  • try 전파와, 같은 오류를 돌려주는 명시적 분기를 비교해요.
  • 양쪽 다 입력, 페이로드 작업, 할당 소유권, 호출자 처리를 똑같이 맞춰요.
  • 성공만 있는 실행과 일부러 넣은 실패를 따로 재요. 그다음 오류 빈도를 기록한 혼합 워크로드를 돌려요.
  • 명시한 워크로드에 포함되지 않는 한 준비 작업은 측정 구간 밖에 둬요.
  • 컴파일러 버전, 빌드 모드, 타깃, 머신 상태를 적고, 편차가 보일 만큼 여러 번 반복해요.

입력에 대해 관련 오류를 모두 배제하는 전제 조건을 명시한다면 성공만 있는 실행에 catch unreachable을 넣을 수 있어요. 결론은 그 전제 안에서만 유효해요. 생성된 코드를 읽으면 나중에 결과를 설명하는 데는 도움이 되겠지만, 결과를 대신하지는 못해요.

이 조건으로 비교해 보겠어요. 아직 측정값은 없어요.

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    같게 맞출 항목에 할당자도 넣어야 한다. 한 후보는 동적 배열을 배치 사이에 재사용한다. 다른 후보는 임시 저장 공간에 만들고 배치마다 비운다. 입력은 같아도 저장 공간의 수명이 다르고, 측정 시간은 그 차이를 말없이 삼킨다. 배열은 만들 때의 할당자를 계속 쥐고 있으니 실행 사이에 컨텍스트를 바꿔도 배열에는 아무 영향이 없다. 컨테이너마다 어떤 할당자를 쥐고 있는지, 어디서 비우는지 적어 둔다. 할당을 측정 구간에 넣든 빼든 그건 작업 부하 설명에 들어가야 한다.

  2. 고유 링크

    목록에 있는 소유권 조건은 실패하는 실행에도 적용되어야 합니다. 첫 번째 버퍼를 얻은 뒤 두 번째에서 실패하는 연산은 오류를 반환하기 전에 첫 번째 버퍼를 해제해야 합니다. 두 후보가 같은 정리 작업을 해야 하며, 그렇지 않으면 실패 측정은 서로 다른 정리 과정을 비교하게 됩니다.

    여기서 자주 확대 해석되는 C 규칙이 하나 있습니다. free(NULL)은 아무 일도 하지 않도록 정의되어 있습니다. 그 규칙은 널 포인터에만 적용됩니다. 첫 번째 버퍼를 두 번 해제하는 것은 정의되지 않은 동작이며, 널 검사로는 유효한 널 아닌 포인터와 이미 해제된 포인터를 구별할 수 없습니다.

같은 질문의 다른 갈래

  1. 어느 빌드 시간을 말하는 건가

    크레이트 분리 이야기는 늘 누군가 빌드 시간 하나를 올리는 것으로 끝난다. 숫자는 두 개고, 움직이는 방향도 다르다. 클린 빌드는 빈 target에서 시작하는 전체 빌드다. 크레이트를 나누면 이쪽은 오히려 조금 나빠질 수 있…

    답글 2rust