gwt 컴파일러의 속도를 높이려면 어떻게해야합니까?


201

우리는 프로젝트에서 GWT를 더 많이 사용하기 시작했으며 GWT 컴파일러의 성능은 점점 더 성 가실 것입니다.

우리는 호스팅 모드 브라우저에 대한 강조를 포함하여 문제를 완화하기 위해 작업 관행을 변경하기 시작할 것입니다. 이는 나중에 GWT 컴파일러를 실행해야 할 필요성을 지연 시키지만 특히 자체 위험을 초래합니다. 우리가 원하는 것보다 훨씬 늦을 때까지 실제 브라우저에서 문제를 발견하지 못했습니다.

이상적으로, 우리는 GWT 컴파일러 자체를 더 빠르게 만들고 싶습니다. 상당히 작은 응용 프로그램을 컴파일하는 데 1 분이 걸립니다. 그러나 우리는 상당히 순진한 방식으로 컴파일을 사용하므로 빠르고 쉽게 얻을 수 있기를 바랍니다.

현재 256m 최대 힙과 많은 스택 공간을 사용하여 Ant Ant 대상에서 Java 애플리케이션으로 com.google.gwt.dev.Compiler를 호출하고 있습니다. 컴파일러는 fork = true 및 최신 Java 6 JRE를 사용하여 Ant에서 시작하여 Java6의 향상된 성능을 활용하려고 시도합니다. 우리는 메인 컨트롤러 클래스를 응용 프로그램 클래스 경로와 함께 컴파일러에 전달합니다.

여분의 속도를 얻기 위해 다른 무엇을 할 수 있습니까? 해야 할 일을 발견하는 데 더 적은 시간을 할애하여 더 많은 정보를 제공 할 수 있습니까?

하나의 브라우저에서만 컴파일하도록 지시 할 수는 있지만 다중 브라우저 테스트를 수행해야하므로 실제로는 실용적이지 않습니다.

이 시점에서 모든 제안을 환영합니다.

답변:


144

불편한 진실부터 시작합시다. GWT 컴파일러 성능은 정말 대단합니다. 여기저기서 해킹을 사용할 수 있지만 성능이 크게 향상되지는 않습니다.

당신이 할 수있는 좋은 성능 해킹은 다음 줄을 삽입하여 특정 브라우저 만 컴파일하는 것입니다 gwt.xml.

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

또는 gwt 2.x 구문으로, 하나의 브라우저에서만 :

<set-property name="user.agent" value="gecko1_8"/>

예를 들어, 이것은 IE와 FF에 대해서만 애플리케이션을 컴파일합니다. 테스트에 특정 브라우저 만 사용하고 있다는 것을 알고 있다면이 작은 핵을 사용할 수 있습니다.

다른 옵션 : 여러 로케일을 사용하고 테스트를 위해 하나만 사용하는 경우 GWT가 기본 로케일을 사용하도록 주석을 모두 작성할 수 있으므로 컴파일 시간에서 추가 오버 헤드가 줄어 듭니다.

결론 : 컴파일러 성능이 크게 향상되지는 않지만 몇 번의 휴식을 취하면 여기저기서 몇 분을 줄일 수 있습니다.


3
GWT 2.0에서는이 구문이 사용자 에이전트를 지정하기를 원합니다. <set-property name = "user.agent"value = "gecko, gecko1_8"/>
mooreds

gwt 2.2에는 도마뱀이 없습니다. 컴파일러는 "값 도마뱀은 이전에 정의되지 않았습니다. 'set-property'요소를 처리하는 동안 예기치 않은 예외가 발생했습니다"
uthark

값을 "gecko1_8"로 설정하면 gwt 2.2에서 Firefox 1.5 이상에서만 작동합니다.
eaykin

이 답변은 거의 2 살입니다. 이 점을 명확히하기 위해 자유롭게 편집하십시오.
유발 아담

6
2013 년에도 여전히 GWT 컴파일 시간이
빨라져

62

-localWorkers 플래그와 함께 GWT 컴파일러를 실행하면 컴파일러는 여러 순열을 병렬로 컴파일합니다. 이를 통해 멀티 코어 머신의 모든 코어를 사용할 수 있습니다. 예를 들어 -localWorkers 2는 두 개의 순열을 병렬로 컴파일하도록 컴파일러에 지시합니다. 크기 차이의 차이는 얻지 못하지만 (컴파일러의 모든 것이 병렬화 가능하지는 않지만) 여러 순열을 컴파일하는 경우 여전히 주목할만한 속도 향상입니다.

트렁크 버전의 GWT를 사용하려는 경우 모든 브라우저에 대해 호스팅 된 모드를 사용할 수 있으므로 (호스트 된 프로세스 모드 제외) 호스팅 된 모드 의 현재 문제를 대부분 완화 할 수 있습니다. 컴파일은 크기가 더 빠를 수 없으므로 GWT가 가고있는 곳 인 것처럼 보입니다. 항상 호스트 모드로 개발하십시오.


2
아, localWorkers 옵션은 보석입니다. 안타깝게도 대부분의 개발 상자는 단일 코어 제온입니다. OOPHM도 매우 유망 해 보입니다. 항상 다음 버전에서, 그것은 ...
skaffman

4
여러 코어가있는 박스에서 컴파일 환경을 가상화합니다. 이 VM에 원격; 최소한의 locals 및 user.agents로 -localWorkers를 사용하여 명령 행 GWT 컴파일을 실행하십시오. vm을 호스팅하는 박스가 배포하려는 네트워크 피어인지 확인하십시오. 이것의 조합은 Tomcat에서 배포시 약 30 초로 컴파일됩니다. 또한이 모든 것을 스크립트로 작성할 수 있습니다. 또한 로컬 컴퓨터에서 개발하고 svn 패치를 만들고 스크립트에서 NFS 또는 samba 공유 유형을 사용하여 패치를 적용하도록하여 src diff 만 복사 할 필요가 없습니다. 예!
kr.

NX 클라이언트는 또한 제한된 ADSL, 케이블 또는 WiFi 연결에서 원격 개발을위한 거대한 +++입니다. 또한 인터넷을 사용하여 어떤 위치에서 사용하고 있든 상관없이 항상 동기화되어 있습니다
kr.

기본적으로 maven 빌드에서 플랫폼 사용 가능한 CPU 수로 설정됩니다. 그래서 여기에는 속도가 없습니다.
keiki

55

이 항목은 상당히 오래되었지만 대부분은 이미 알고 있지만 GWT 2.x에는 최적화를 건너 뛰어 컴파일 속도를 높이는 새로운 컴파일 플래그가 포함되어 있다고 언급 할 가치가 있다고 생각합니다. 그런 식으로 컴파일 된 JavaScript를 배포해서는 안되지만 비 프로덕션 연속 빌드 중에는 시간을 절약 할 수 있습니다.

-draftCompile 플래그를 GWT 컴파일러 라인에 포함 시키십시오.


3
그 옵션을 사용했는데 프로젝트에서 때때로 이상한 오류로 실패했습니다. 따라서 때때로이 때문에 컴파일이 작동하지 않을 수 있습니다.
Vic

31

설정할 수 있는 user.agent 값 목록은 다음과 같습니다 .

(크롬에 대한 순열 만 생성하도록 설정해야 할 것을 검색 할 때 여기에 계속 끝나기 때문에 여기에 추가하십시오. 대답은 다음과 같습니다. <set-property name="user.agent" value="safari"/>)


이 집합 속성 요소를 어디에 추가해야합니까? app.gwt.xml 파일에서 <module> 요소의 내부와 외부에 추가하려고 시도했지만 작동하지 않습니다.
Alex Worden

ABC는 모듈 이름 인 모듈 ABC.gwt.xml 파일에 들어갑니다.
Glenn

30

최신 버전의 GWT (2.3 또는 2.4로 시작)에서 추가 할 수 있습니다

<collapse-all-properties />

개발 목적으로 gwt.xml에 추가하십시오. 그러면 GWT 컴파일러에게 모든 로케일과 브라우저를 포함하는 단일 순열을 작성하도록 지시합니다. 따라서 여전히 모든 브라우저와 언어에서 테스트 할 수 있지만 여전히 단일 순열 만 컴파일하고 있습니다


2
흥미 롭다 ... 단점은 무엇인가?
skaffman

모든 브라우저와 언어를 처리하는 단일 순열을 컴파일하는 것은 여전히 ​​하나의 브라우저와 언어를 처리하는 단일 순열보다 약간 더 많은 시간이 걸리지 만 그 차이는 제 경험상 중요하지 않습니다. (~ 25 % 더 많은 것이 내가보고있는 것이지만, 여전히 여러 순열을 컴파일하는 것보다 크게 개선되었습니다)
Chi

이것에 대한 문서 링크를 찾을 수 없습니다 ... 무언가에 연결할 수 있습니까?
skaffman

이 태그는 컴파일 속도를 높이지만 Super Dev Mode (최소 2.6 이상)에서 디버깅을 중단합니다. 크롬 디버거에 표시된 소스 코드는 컴파일 된 js 코드와 다릅니다. 따라서 일부 Java 메소드에 중단 점을 넣으면 디버거가 다른 메소드에서 중지됩니다.
damluar

18

프로덕션 용 빌드에 하나의 옵션을 추가 할 수 있습니다.

-localWorkers 8– 여기서 8은 순열을 계산하는 동시 스레드 수입니다. 이 번호를보다 편리한 번호로 조정하기 만하면됩니다. GWT 컴파일 성능을 참조하십시오 (Dennis Ich 의견 덕분에).

테스트 환경으로 컴파일하는 경우 다음을 사용할 수도 있습니다.

-draftCompile 더 빠르지 만 최적화되지 않은 컴파일을 가능하게합니다.

-optimize 0 코드를 최적화하지 않는 (9는 최대 최적화 값입니다)

빌드 및 호스트 모드 성능을 두 배 이상 향상시킨 또 다른 사항은 SSD 디스크를 사용하는 것입니다 (현재 호스트 모드는 매력처럼 작동 함). 저렴한 솔루션은 아니지만 GWT 사용량과 시간 비용에 따라 그만한 가치가 있습니다!

이것이 당신에게 도움이되기를 바랍니다!


현지 근로자를 코어 수로 설정하는 것은 매우 비생산적 일 수 있습니다. 참조 : josephmarques.wordpress.com/2010/07/30/…
Dennis Ich

의견을 보내 주셔서 감사합니다 Dennis. 실제로 SSD가 있고 2G의 메모리를 제공합니다. 물론 localWorker의 수는 순열, 코어, 머신 등의 수에 따라 각 경우에 맞게 조정되어야합니다. 필자의 경우, 랩톱에서 컴파일 할 때 웹에서 탐색하려는 경우 코어 2 개를 비워 두십시오. 그것은 단지 예일뿐입니다. 그러나 아이디어를 포함하도록 내 게시물을 편집합니다. 감사.
martins.tuga

14

GWT 컴파일러는 많은 코드 분석을 수행하므로 속도를 높이기가 어려울 수 있습니다. Google IO 2008 세션은 GWT가 수행하는 작업과 시간이 오래 걸리는 이유를 알려줍니다.

내 권장 사항은 개발을 위해 가능한 한 많이 호스트 모드를 사용하고 테스트를 원할 때만 컴파일하는 것입니다. 이것은 이미 온 솔루션처럼 들리지만 기본적으로 호스팅 모드가있는 이유입니다 (잘, 그리고 디버깅).

GWT 컴파일 속도를 높일 수 있지만 GWT가 기본적으로하는 5 가지가 아닌 일부 브라우저에서만 컴파일 할 수 있습니다. 호스트 모드를 사용하려면 적어도 두 개의 브라우저를 컴파일해야합니다. 단일 브라우저로 컴파일하면 브라우저 감지 코드가 최적화되어 호스트 모드가 더 이상 작동하지 않습니다.

더 적은 수의 브라우저를 위해 컴파일을 구성하는 쉬운 방법은 기본 모듈에서 상속되는 두 번째 모듈을 만드는 것입니다.

<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
  <!-- If you compile for only one browser, the browser detection javascript
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

경우 rename-to속성이 같은 설정은 전체 컴파일을 한 것처럼 다음 출력 파일은 동일합니다


11
  • 응용 프로그램을 여러 모듈 또는 진입 점으로 분할 한 다음 필요할 때만 다시 컴파일하십시오.
  • 컴파일 버전을 제공하는 트렁크 버전을 사용하여 응용 프로그램을 분석하십시오 . 1.6 컴파일러와 관련이있을 수도 있고 아닐 수도 있지만 진행 상황을 나타낼 수 있습니다.

GWT는 항상 코드에 연결된 모든 것을 검사하고 모 놀리 식 최종 결과를 컴파일하기 때문에 여러 진입 점이 작동하지만 모듈은 작동하지 않습니다. GWT 프레임 워크는 모듈화 원칙에 대한 혼란과 수치입니다. GWT 프레임 워크를 재사용하는 좋은 프로젝트를 찾지 못했습니다.
user1050755

4

GWT 2.x의 경우 방금 사용하면

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

둘 이상의 순열을 지정할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.