openlang

공정하게 비교하려면 실패에 대한 약속도 같아야 해요

부분 검토

가상의 비교 하나를 생각해 봐요. 함수는 오류 유니언을 반환해요. 한 버전은 try로 실패를 호출자에게 전달해요. 더 빠르다고 가정한 버전은 그 자리에 catch unreachable을 써요. 제 첫 의심은 실험의 대상이 달라졌다는 거예요.

두 번째 버전은 실패가 일어날 수 없다고 단언해요. 실패가 실제로 일어나면 안전성 검사가 켜진 빌드에서는 비정상 종료될 수 있어요. 그 오류를 반환할 의무를 없앴으니, 두 표현의 시간을 재는 것만으로 같은 동작의 비용을 비교했다고 할 수는 없어요.

우선 오류 전파와, 같은 오류를 반환하는 명시적인 분기를 비교하겠어요. 두 버전의 입력, 성공 값으로 하는 작업, 할당된 메모리의 소유권, 호출자 쪽 처리를 같게 맞춰요. 성공하는 연산과 의도적으로 실패를 주입한 연산을 따로 살펴본 뒤, 오류 빈도를 기록한 혼합 워크로드도 넣어요. 준비 작업이 명시한 워크로드의 일부가 아니라면 측정 구간 밖에 둬요. 컴파일러 버전, 빌드 모드, 타깃, 머신 상태를 기록하고, 변동을 볼 만큼 반복해서 측정해요.

성공 사례만 다루는 별도 실험에서는 명시한 전제 조건이 해당 입력에서 모든 관련 오류를 배제한다면 catch unreachable을 넣을 수도 있어요. 결론도 그 전제 조건 안에만 머물러야 해요. 생성된 코드를 살펴보면 나중에 얻을 결과를 설명하는 데 도움이 될 수 있지만, 그 자체가 측정 결과가 되지는 않아요.

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

이어지는 대화 3

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

    입력의 흐름 옆에 할당 흐름도 둔다. Odin의 동적 배열은 나중에 컨텍스트가 바뀌어도 할당자를 유지한다. 한 후보는 배열을 여러 배치에 걸쳐 재사용하고 다른 후보는 배치마다 임시 저장 공간을 비운다면, 측정 시간에는 서로 다른 저장 공간 수명도 들어간다. 각 컨테이너가 어느 할당자를 유지하는지 명시하고, 비우는 시점을 워크로드 설명에 적는다. 이런 기록은 할당을 측정 구간에 넣을지 결정하기 전에도 필요하다.

  2. 고유 링크

    할당된 메모리의 소유권을 같게 맞춘다는 조건에는 실패한 연산도 포함해야 합니다. 한 연산이 버퍼 하나를 확보한 뒤 두 번째 버퍼를 확보하지 못한다고 가정해 보겠습니다. 오류를 반환하기 전에 첫 버퍼를 누가 해제하는지 정하고, 양쪽 모두에 그 작업을 포함하십시오. C에서 free는 인수가 널 포인터이면 아무 일도 하지 않습니다. 그 규칙은 첫 버퍼를 두 번 해제하는 경우에는 적용되지 않으며, 그런 해제는 정의되지 않은 동작입니다. 널 검사는 널이 아닌 포인터가 여전히 유효하다는 근거가 되지 못합니다.