Java compile speed vs Scala compile speed

Od jakiegoś czasu programuję w Scali i lubię to, ale jedno mnie irytuje, to czas potrzebny na kompilację programów. Wydaje mi się, że to drobiazg, ale w Javie mogłem wprowadzić drobne zmiany w moim programie, kliknąć przycisk Uruchom w netbeans, i BUM, działa, a z czasem Kompilacja w Scali wydaje się pochłonąć dużo czasu. Słyszałem, że w przypadku wielu dużych projektów język skryptowy staje się bardzo ważny ze względu na czas kompilacji, potrzeby, której nie widziałem kiedy używałem Javy.

Ale pochodzę z Javy, która, jak rozumiem, jest szybsza niż jakikolwiek inny skompilowany język i jest szybka z powodu powodów, dla których przełączyłem się na Scalę (jest to bardzo prosty język).

Więc chciałem zapytać, Czy Mogę sprawić, by Scala kompilowała się szybciej i czy scalac kiedykolwiek będzie tak szybki jak javac.

Author: skaffman, 2010-08-16

8 answers

Kompilator Scala jest bardziej wyrafinowany niż Java, zapewniając wnioskowanie typów, domyślną konwersję i znacznie wydajniejszy system typów. Funkcje te nie są dostępne za darmo, więc nie spodziewałbym się, że scalac kiedykolwiek będzie tak szybki jak javac. Odzwierciedla to kompromis pomiędzy programistą wykonującym pracę, a kompilatorem wykonującym pracę.

To powiedziawszy, czasy kompilacji już znacznie się poprawiły przechodząc ze Scali 2.7 do Scali 2.8 i oczekuję, że ulepszenia będą kontynuowane teraz, gdy pył osadził się na 2.8. ta strona dokumentuje niektóre z trwających wysiłków i pomysłów mających na celu poprawę wydajności kompilatora Scali.

Martin Odersky podaje znacznie więcej szczegółów w swojej odpowiedzi.

 54
Author: Aaron Novstrup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:43

Istnieją dwa aspekty (braku) szybkości kompilatora Scali.

  1. Większy rozruch

    • Scalac składa się z wielu klas, które muszą być załadowane i skompilowane JIT

    • Scalac musi przeszukiwać classpath dla wszystkich pakietów i plików roota. W zależności od rozmiaru ścieżki klasowej może to potrwać od jednej do trzech dodatkowych sekund.

    Ogólnie rzecz biorąc, spodziewaj się uruchomienia nad głową 4-8 sekund, dłużej, jeśli uruchom go za pierwszym razem, aby bufory dyskowe nie były wypełnione.

    Odpowiedzią Scali na napowietrzne uruchamianie jest użycie fsc lub ciągłe budowanie z SBT. IntelliJ musi być skonfigurowany tak, aby korzystać z obu opcji, w przeciwnym razie jego narzut nawet dla małych plików jest nieracjonalnie duży.

  2. Wolniejsza prędkość kompilacji. Scalac zarządza około 500 do 1000 linii / sek. Javac zarządza około 10 razy więcej. Powodów jest kilka.

    • Wnioskowanie typu jest kosztowne, w szczególnie, jeśli wiąże się to z ukrytym poszukiwaniem.

    • Scalac musi wykonać sprawdzenie typu dwa razy; raz zgodnie z regułami Scali i drugi raz po usunięciu zgodnie z regułami Javy.

    • Oprócz sprawdzania typu istnieje około 15 kroków transformacji, które wymagają czasu.

    • Scala zazwyczaj generuje o wiele więcej klas na dany Rozmiar Pliku niż Java, w szczególności jeśli idiomy funkcjonalne są intensywnie używane. Generowanie bajtów i pisanie zajęć wymaga czasu.

    Z drugiej strony, 1000-liniowy program Scala może odpowiadać 2-3K-liniowemu programowi Java, więc niektóre z wolniejszych prędkości liczonych w liniach na sekundę muszą być zrównoważone z większą funkcjonalnością w linii.

    Pracujemy nad poprawą szybkości (np. poprzez równoległe generowanie plików klasowych), ale nie można oczekiwać cudów na tym froncie. Scalac nigdy nie będzie tak szybki jak javac. Wierzę, że rozwiązanie będzie leżeć w kompilacji serwerów takich jak fsc w połączeniu z dobrą analizą zależności tak, że tylko minimalny zestaw plików musi być rekompilowany. Nad tym też pracujemy.

 446
Author: Martin Odersky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 07:23:20

Powinieneś być świadomy, że kompilacja Scali trwa co najmniej o rząd wielkości dłużej niż kompilacja Javy. Przyczyny tego są następujące:

  1. konwencje nazewnictwa (plik XY.scala nie musi zawierać klasy o nazwie XY i może zawierać wiele klas najwyższego poziomu). kompilator może więc przeszukiwać więcej plików źródłowych, aby znaleźć dany identyfikator klasy / cechy / obiektu.
  2. Implicits - intensywne użycie implicits oznacza, że kompilator musi przeszukać dowolne in-scope implicit konwersji dla danej metody i rangi je znaleźć "prawo" jeden. (tzn. kompilator ma znacznie zwiększoną domenę wyszukiwania podczas lokalizowania metody.)
  3. system typu-system typu scala jest o wiele bardziej skomplikowany niż Java i dlatego zajmuje więcej czasu procesora.
  4. wnioskowanie typu-wnioskowanie typu jest kosztowne obliczeniowo i zadanie, które javac w ogóle nie musi być wykonywane
  5. Zawiera 8-bitowy symulator w pełni uzbrojonego i sprawnego battle station, wyświetlana za pomocą magicznej kombinacji klawiszy CTRL-ALT-F12 podczas kompilacji GenICode .
 39
Author: oxbow_lakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 03:31:23

Najlepszym sposobem na zrobienie Scali jest IDEA i SBT. Skonfiguruj elementarny projekt SBT (co zrobi za Ciebie, jeśli chcesz) i uruchom go w trybie automatycznej kompilacji (polecenie ~compile), a kiedy zapiszesz swój projekt, SBT przekompiluje go.

Możesz również użyć wtyczki SBT dla IDEA i dołączyć akcję SBT do każdej konfiguracji Run. Wtyczka SBT daje również interaktywną konsolę SBT w ramach IDEA.

Tak czy inaczej (SBT działa zewnętrznie lub SBT plug-in), SBT pozostaje uruchomiony w ten sposób wszystkie klasy używane w budowaniu projektu zostają "rozgrzane" i JIT-ed, a koszty rozruchu są eliminowane. Dodatkowo SBT kompiluje tylko pliki źródłowe, które tego potrzebują. Jest to zdecydowanie najbardziej efektywny sposób budowania programów Scala.

 19
Author: Randall Schulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 12:56:42

Najnowsze wersje Scala-IDE (Eclipse) są znacznie lepsze w zarządzaniu kompilacją przyrostową.

Zobacz " jaki jest najlepszy system budowania Scali?" Więcej.


Innym rozwiązaniem jest integracja FSC - szybkiego kompilatora offline dla języka Scala 2 - (jak zilustrowano w tym blogu) jako konstruktora w IDE.

alt text

Ale nie w bezpośrednio choć, jak wspomina Daniel śpiewak w Komentarze:

Nie powinieneś używać FSC bezpośrednio w Eclipse, choćby dlatego, że Eclipse już używa FSC pod powierzchnią.
FSC jest w zasadzie cienką warstwą na wierzchu kompilatora rezydentnego, który jest dokładnie mechanizmem używanym przez Eclipse do kompilowania projektów Scali.


Wreszcie, jako Jackson Davis przypomina mi w komentarzach:

Sbt (Simple build Tool) zawiera również pewien rodzaj" przyrostowej " kompilacji (poprzez Trigger execution ), mimo że nie jest idealna , a enhanced incremental compilation jest w pracy nad nadchodzącą wersją 0.9 sbt.

 8
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:01

Use fsc - jest to szybki kompilator Scali, który siedzi jako zadanie w tle i nie wymaga ładowania przez cały czas. Może ponownie użyć poprzedniej instancji kompilatora.

Nie jestem pewien, czy wtyczka Netbeans scala obsługuje fsc( dokumentacja tak mówi), ale nie mogłem tego zrobić. Wypróbuj nocne wersje wtyczki.

 6
Author: Denis Tulskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-16 04:00:45

Możesz użyć wtyczki JRebel, która jest darmowa dla Scali. Możesz więc "rozwijać się w debuggerze", a JRebel zawsze przeładowywałby zmienioną klasę na miejscu.

Przeczytałem gdzieś oświadczenie samego Martina Odersky ' ego, w którym mówi, że wyszukiwanie wartości niejawnych (kompilator musi upewnić się, że nie ma więcej niż jednego implicit dla tej samej konwersji, aby wykluczyć niejednoznaczności) może zająć kompilator. Więc może być dobrym pomysłem, aby poradzić sobie z care.

Jeśli nie musi to być 100% Scala, ale też coś podobnego, możesz spróbować Kotlin .

-- Oliver

 3
Author: OlliP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-09 13:47:14

Jestem pewien, że będzie to przegłosowane, ale niezwykle szybki zwrot nie zawsze sprzyja jakości lub produktywności.

Poświęć trochę czasu na przemyślenie i wykonanie mniej mikrocykli rozwojowych. Dobry kod Scali jest gęstszy i bardziej istotny (tzn. wolny od przypadkowych szczegółów i złożoności). Wymaga więcej myślenia ,a to wymaga czasu (przynajmniej na początku). Możesz postępować dobrze z mniejszą liczbą cykli kodu / testowania / debugowania, które są indywidualnie nieco dłuższe i nadal poprawiają twoje Produktywność i jakość twojej pracy.

W skrócie: poszukaj optymalnego wzorca pracy lepiej dopasowanego do Scali.

 2
Author: Randall Schulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-16 05:12:21