단위 테스트를위한 최소 Emacs 25 구축


10

내 Emacs Lisp 패키지의 단위 테스트를 위해 최소한의 Emacs 트렁크 변형을 만들고 싶습니다. 빌드에는 GUI, 이미지 지원 등이 필요하지 않습니다. 기본적으로 Emacs Lisp 핵심 라이브러리를 갖춘 최소한의 Emacs Lisp 인터프리터 여야 하며 5 분 이내에 신속하게 빌드해야합니다 .

현재, 나는 통과하고 있습니다 --with-x-toolkit=no --without-x --without-all./configure. 완료된 후에는 모든 Emacs 기능이 비활성화되었다고 알려주지 만 불행히도 빌드에는 여전히 거의 10 분이 걸립니다 .

Emacs를 더 빨리 빌드하는 것이 불가능할 수도 있지만, Emacs 24.5 가 거의 같은 플래그로 2 분만 에 빌드 한다는 사실을 궁금해 합니다.

이 중대한 차이의 이유는 무엇이며, Emacs 트렁크를 Emacs 24.5만큼 빠르게 구축 할 수 있습니까?

그리고 관련 질문에서 Emacs가 조용히 구축하는 방법은 무엇입니까? 현재 단위 테스트 출력의 거의 80 %가 Emacs 빌딩입니다. 이상적으로는 make install출력물을 전혀 인쇄하지 않고 싶습니다 .


일종의 CI 플랫폼에서이 작업을 수행 할 계획입니까? 어떤 종류의 컴퓨터를 사용하지 않습니까? 분명히 빌드 속도는 프로세서에 따라 크게 좌우되지만 ./configure --with... && make -j (number of cores * 1.5)30 초 안에 완료됩니다. 로컬 머신에서 실행중인 경우 -j 인수를 사용하여 작성하십시오. 그럴만한 이유가 make install있습니까? src 디렉토리에서 emacs를 실행하면 피할 수있는 약간의 시간이 추가됩니다.
Jordon Biondo

트래비스 CI인데 왜 중요한지 모르겠습니다. 내가 설명하고 싶은 동일한 컴퓨터 에서 두 개의 서로 다른 Emacs 버전의 큰 차이 입니다. 같은 시스템 에서 트렁크를 5 배 더 길게 만드는 이유는 무엇입니까?
lunaryorn

저장소에서 빌드하려면 이미 분산 타르볼에있는 특정 파일을 작성해야합니다.
politza

@politza 어떤 파일? ./autogen.sh을 생성 하기 위해 실행해야한다는 것을 알고 configure있지만 몇 분이 아닌 몇 초입니다.
lunaryorn

2
@lunaryom 세 가지가 별도 여기에 질문. 1 : 이맥스를 빠르게 만드는 방법, 2 : 이맥스 25가 왜 이맥스 24.5보다 느리게 빌드 되는가 make install? 따라서이 질문들을 3 개의 질문으로 나눠서 개별적으로 추적 할 수 있도록 한 질문을 고수하도록이를 편집하십시오.
rocky

답변:


8

24.5가 너무 빨리 빌드되는 이유는 .elc파일이 실제로 tarball에 배포되어 있기 때문입니다 ( make-dist 참조) . git에서 빌드 할 때 대부분의 시간은 .el파일을로 컴파일하는 데 소비 됩니다 .elc. C 코드를 최적화하면 Lisp 컴파일 속도가 빨라지지만 여전히 오랜 시간이 걸립니다. 원래 설정을 사용하여 빌드 시간 (~ 14 vs ~ 1 분)을 사용 하는 빌드CFLAGS='-O2 -march=native' (~ 9 vs ~ 1.5 분)를 비교하십시오.

또한 git에서 복제하는 데 약 1 분이 걸리며 tarball을 다운로드하고 압축을 풀 때 약 5 초가 걸립니다. github에서 git 아카이브를 다운로드 할 때 버전 간 빌드 시간을 비교하십시오 (각각 v24.5, master 및 emacs-25의 경우 ~ 5, ~ 6, ~ 8 분). 배포판을 사용하지 않을 때 모든 빌드 시간은 최소한 같은 차수입니다 (이맥스 -25가 마스터보다 느린 이유, 무작위 변형 또는 마스터에서 일부 오래된 코드가 제거 된 이유는 확실하지 않음).

그리고 관련 질문에서 Emacs가 조용히 구축하는 방법은 무엇입니까? 현재 단위 테스트 출력의 거의 80 %가 Emacs 빌딩입니다. 이상적으로는 make install출력물을 전혀 인쇄하지 않고 싶습니다 .

언제든지 출력을로 리디렉션 할 수 있습니다 /dev/null. 내 실험 make installgrep -E '^(make|[A-Z])'위해 출력을 줄이려고 출력을 파이프했습니다 (웹에서 로그를 형식화하는 Travis CI 자바 스크립트가 전체 출력에 문제가있었습니다).

Emacs 트렁크를 Emacs 24.5만큼 빠르게 구축 할 수 있습니까?

아니요 (또는 Emacs 24.5가 Emacs trunk : p만큼 느리게 빌드되도록 할 수 있다는 의미에서 그렇습니다). 그러나 Emacs 빌드를 저장하고 캐시 된 결과를 다운로드하여 단위 테스트를 수행하면됩니다. emacs-travis 포크 의 업로드 브랜치 에서 이것을 구현했습니다. 다음 은 yasnippet의 사용 예입니다 . Emacs 설치 시간은 ~ 2.5 초입니다.


3

다양한 제안이 있습니다.

  1. elc 파일이 없습니다.

아래에 언급 된 바와 같이, 모든 lisp 파일을 컴파일하는 것은 시간의 10 % 이상을 차지합니다. 이를 비활성화하는 한 가지 방법 은 파일 에서 loaddefs 대상 을 편집 lisp/Makefile하고 다음으로 변경하는 것입니다.

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. 컴파일러 최적화 또는 디버거 심볼 테이블이 없음

현재 --with-x-toolkit = no --without-x --without-all을 ./configure에 전달하고 있습니다.

src 에서 C 컴파일 시간을 기본 컴파일 플래그를 변경하는 시간 (1 분에서 16 초로 1/4)으로 줄일 수있었습니다 . 내가 얻은 기본 CFLAGS는 다음과 같습니다 -g -O3.

따라서 대신 사용하십시오 CFLAGS=''.

  1. 을 실행하지 말고 src 디렉토리 make install내부에서 빌드 된 emacs를 실행하십시오 .

아래에 언급 된 바와 같이 시간의 10 %는 문서 작성에 있습니다. 시간이 없었지만 파일을 복사하고 elisp 파일을 압축하는 데는 많은 시간이 필요 make install합니다. 그러지 마 타이밍 차트를 다시 실행하려면을 실행하십시오 remake --profile.

위의 관찰 결과는 다음과 같습니다 ....


첫 번째 단계는 시간을 줄이는 방법을 파악하는 데 소요되는 시간을 이해하는 것입니다. 다행스럽게도 Emacs와 같은 것을 위해 최근에 여러분이 알아내는 데 도움이되는 도구를 작성했습니다. 리메이크 (GNU make 포크) --profile옵션을 추가하여 특정 대상에 소요되는 시간을 알려줍니다.

최근 스냅 샷을 작성하려고했는데 약 10 분 정도 걸립니다. 리메이크를 설치하지 않은 경우, 내 달리기에 사용할 수 있는 프로파일 링 정보가 있습니다. kcachegrind를 사용하여 정보를 표시하지만 시각화 도구를위한 다른 도구가있을 수 있습니다. 요점에 런의 스크린 샷 인 png가 있습니다.

이제 세부 사항으로 ...

내 실행에서는 약 20 %의 시간이 실제로 필요하지 않은 lisp 및 info 파일을 작성하는 데 소비됩니다. 실제로는 정보 파일보다 lisp 파일에 조금 더 소비됩니다. 아마도 Makefile을 변경하여 건너 뛸 수 있습니다.

emacs 24와 비교하면 흥미로울 것입니다. 제 생각에는이 두 크기의 크기가 비례 적으로 커졌다는 것입니다.

관심이 있다면 (공개 투표로 표시 할 수 있음) Makefile에 특정 해킹을 제안합니다. 그러나 이것만으로도 누군가가 일하기 위해 동기를 부여하기에 충분해야합니다.


"시간의 20 %가 lisp를 만드는 데 소비됩니다"-@lunaryorn의 emacs-travis repo를 복제 make lisp하여 Emacs 25의 경우 약 60 %를 차지하는 것 같습니다 : travis-ci.org/npostavs/emacs-travis/builds/91107858 . 그리고 많은 덩어리 make src가 lisp를 컴파일하고 있기 때문에 이러한 측정을 조정하는 방법이 궁금합니다. Emacs 24에서는 cc-*.el파일을 컴파일하는 것만으로 보입니다 make lisp. 버그입니까?
npostavs

또한 이것은 착시 일 수도 있지만 프로파일 링 사진의 총 합이 약 50 %에 불과합니다.
npostavs

@npostavs는 대상의 시간 만 프로파일로 리메이크하며 자체는 포함하지 않습니다. lisp 아래에있는 모든 파일과 디렉토리를 사용하면 "make"/ "make"에서 무엇을 다시 작성해야하는지 계산하는 데 상당한 시간이 소요될 수 있습니다. 또한 '리메이크'가 메이크의 포크 일지라도 비슷하지만, 더 자세히 비교하려면 리메이크 프로파일 링 출력 시간을 "메이크"가 아닌 프로파일 링없이 "리메이크"와 비교해야합니다. 또한 동일한 리메이크 / 마지막으로, % 등으로 퀴즈를 풀 수 있지만 전반적인 제안은 데이터를 사용하여 적용되는 것 같습니다.
rocky

또한 내 측정은 CFLAGS=''C 컴파일 속도를 높이고 lisp 컴파일 속도를 늦추는 것을 사용했습니다. 그것이 나오는 것에 따라, 사용은 CFLAGS='-O2 -march=native'빠른 전체 이맥스 25입니다 이맥스 24.5 느리게 생각 : travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs 관찰 : CFLAGS를 설정하면 "C 컴파일 속도가 빨라지고 lisp 컴파일 속도가 느려집니다." 그러나 단일 테스트를 실행하려는 경우 전체 시간 : 확실하지 않은 일부 C 컴파일 / 빌드 + LISP 컴파일 + LISP 테스트 실행이 최적화되지 않은 C 컴파일 / 빌드 + LISP 없음보다 전체 시간인지 확실하지 않습니다. 컴파일 + LISP 테스트 실행.
rocky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.