2010-09-16 14 views
26

Używam komputera z ośmioma rdzeniami do zbudowania aplikacji Java za pomocą Ant (poprzez cel javac). Czy istnieje sposób na przyspieszenie kompilacji za pomocą więcej niż jednego wątku lub procesu?Używanie wielu rdzeni/procesorów podczas kompilowania Java

Wiem, że mogę równolegle wykonywać kilka zadań Ant, ale nie sądzę, że można to zastosować do pojedynczego celu kompilacji, czy nie?

+2

Zobacz powiązane pytanie tutaj: http://stackoverflow.com/questions/523575/is-there-a-way-to-improve-multicore-multiprocessor-performance-of-the-java-com – Elijah

Odpowiedz

17

Nie wiem w żaden sposób, aby powiedzieć samemu sobie, aby efektywnie wykorzystać wiele rdzeni. Ale you can tell ant to use the Eclipse Compiler, który ma wbudowaną obsługę multithreaded compilation.

+0

Oto ładny artykuł na blogu o [Uruchamianie Eclipse Java Compiler with Ant] (http://owenou.com/2009/11/18/running-eclipse-java-compiler-with-ant.html). – sschuberth

+1

Używanie Intellij 2017.1.3 z JDK 1.8 javac kończy się szybciej niż kompilator Eclipse w obu instancjach - równoległe kompilacje włączone i wyłączone. Dzięki niemu nasz projekt zajmuje około 23 sekund na przebudowanie z Javac i ~ 27 sekund na przebudowanie za pomocą programu eclipse - dziwacznego, ponieważ jest to 4-rdzeniowy procesor i7. – Volksman

1

The documentation wydaje się wskazywać, że jest mało prawdopodobne, aby działało poprawnie z javac.

ktoś próbuje uruchomić duże Ant sekwencje zadań równolegle, takie jak javadoc i javac w tym samym czasie, jest niejawnie biorąc na siebie zadanie identyfikacji i ustalania wszystkich błędów współbieżności zadań, które działają one.

W związku z tym, chociaż zadanie to ma zastosowanie, powinno być uważane za zaawansowane zadanie, które powinno być używane w niektórych sytuacjach przetwarzania lub testowania wsadowego, a nie łatwą sztuczką do przyspieszenia czasów kompilacji na wieloprocesorowym procesorze.

+0

upvote, również z dokumentu: 'Zadania osób trzecich mogą, ale nie muszą być bezpieczne dla wątków, a niektóre podstawowe zadania Ant, takie jak , nie są na pewno ponownie wprowadzone." – VolkerK

2

Dopóki javac, do którego dzwonisz, nie używa wszystkich rdzeni, nie ma znaczenia, co mówisz w Ant. Można użyć atrybutu compiler, aby określić, który kompilator Javy powinien zostać użyty do tego zadania.

Jeśli masz kilka celów kompilacji, możesz użyć fork=yes, aby wykonać cel (y) zewnętrznie.

http://ant.apache.org/manual/Tasks/javac.html#compilervalues

+3

+1. Chcę tylko dodać, że obecnie 'javac' jest jednowątkowe (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6629150) i nie jest to trywialne zadanie aby uczynić go wielowątkowym (http : //blogs.sun.com/jjg/entry/towards_a_multi_threaded_javac). –

0

Nie o ile wiem. Kompilator Eclipse wykonał pewną pracę, aby przyspieszyć używanie wielu rdzeni, ale nie kupuje tak dużo, jak byś sobie tego życzył.

Pytanie brzmi, czy możesz żyć z kompilacją przyrostową dla rozwoju i rekompilować tylko te, które uległy zmianie? Pełną przebudowę można następnie pozostawić na serwerze kompilacji.

0

Można użyć Buck Build, aby zwiększyć szybkość budowy i wykorzystać wiele rdzeni.

W skrócie:

Buck jest system budowania opracowane i wykorzystywane przez Facebook. Zachęca do tworzenia małych, wielorazowych modułów składających się z zasobów kodu i i obsługuje wiele języków na wielu platformach.

Buck buduje niezależne artefakty równolegle, aby skorzystać z wielu rdzeni na swoim komputerze. Co więcej, zmniejsza on czasy przyrostowe o śledząc niezmienione moduły, tak aby minimalny zestaw modułów został przebudowany.

Powiązane problemy