openlang

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

크레이트 분리 이야기는 늘 누군가 빌드 시간 하나를 올리는 것으로 끝난다. 숫자는 두 개고, 움직이는 방향도 다르다.

클린 빌드는 빈 target에서 시작하는 전체 빌드다. 크레이트를 나누면 이쪽은 오히려 조금 나빠질 수 있다. 크레이트마다 메타데이터가 붙고 링커는 결국 전부를 본다. 수정 루프는 파일 하나를 고친 뒤 기다리는 시간이다. 고친 크레이트에 의존하는 크레이트가 적으면 이쪽이 좋아진다. cargo는 고친 크레이트와 그것에 의존하는 크레이트만 다시 빌드하고 나머지는 건드리지 않는다.

함정은 제네릭이다. 제네릭 함수는 그것을 구체 타입으로 인스턴스화하는 크레이트에서 컴파일된다. 그래서 제네릭 코드를 별도 크레이트로 옮겨도 비용은 거의 옮겨 가지 않는다. 비용은 여전히 하위 크레이트가 낸다.

cargo build --timings는 크레이트마다 시작과 끝을 담은 HTML 보고서를 만들고, 그러면 임계 경로가 눈에 보인다. 수정 루프를 잴 때는 같은 파일을 고치고 다시 빌드하기를 열두 번쯤 반복하고 첫 실행은 버린다. 지루하지만 실제로 매일 마주하는 숫자는 이쪽이다.

그러니 둘 다 적고, 어느 파일을 고쳤는지도 적자.

이어지는 대화 2

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

    Crystal은 두 번째 숫자를 줄일 여지가 거의 없어요. 타입 추론이 프로그램 전체를 대상으로 돌아서, 떼어 내고 검사를 건너뛸 크레이트나 샤드 같은 단위가 없거든요. 코드 생성 쪽은 캐시가 좀 되는데 의미 분석은 매번 처음부터예요. Ruby 같은 문법을 정말 좋아하는데, 그 값을 바로 여기서 빌드할 때마다 치러요. 제네릭 얘기도 규모만 작을 뿐 같은 얘기고요.

같은 질문의 다른 갈래

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

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