2012-04-22 28 views
45

Język Julia kompiluje skrypt za każdym razem, czy nie możemy skompilować plików binarnych z julia? Wypróbowałem mały skrypt helloworld z funkcją println, która trwała 2,3 sekundy, aby julia wyświetliła wynik! Byłoby lepiej, gdybyśmy mogli tworzyć pliki binarne zamiast kompilować je za każdym razem, gdy za każdym razem, gdy zadawałem to pytanie, zaktualizowałem: Julia zmieniła trochę Julia. Chociaż już nie śledzę aktualizacji julia, ponieważ zadałem to pytanie i jeśli szukasz czegoś podobnego, spójrz na poniższe odpowiedzi i komentarze osób, które śledzą julia.Julia kompiluje scenariusz za każdym razem?

Ponadto dobrze jest wiedzieć, że załadowanie skryptu trwa około 150ms.

Odpowiedz

35

W tej chwili Julia JIT kompiluje całą standardową bibliotekę podczas uruchamiania. Znamy sytuację i obecnie pracujemy nad buforowaniem danych wyjściowych JIT LLVM, aby zaradzić tej sytuacji, ale do tego momentu nie ma możliwości obejścia tego problemu (z wyjątkiem korzystania z REPL).

+17

Zostało to zaimplementowane w nocnych koszulkach Julii i zostanie dołączone do wydania 0.3. Czas uruchomienia znacznie się poprawił. –

88

Odpowiedź Keno jest na miejscu, ale może dam mu trochę więcej szczegółów na temat tego, co się dzieje i co zamierzamy z tym zrobić.

Obecnie istnieje tylko w trybie JIT LLVM:

  • Istnieje bardzo trywialne tłumacza dla niektórych prostych stwierdzeń najwyższego poziomu.
  • Cały inny kod jest wstawiany do kodu maszynowego przed wykonaniem. Kod jest agresywnie wyspecjalizowany przy użyciu typów wykonawczych wartości, do których kod jest stosowany, propagowanych w programie przy użyciu dynamicznego wnioskowania typu.

ten sposób Julia dostaje dobrą wydajność nawet gdy kod jest napisane bez adnotacji typu: jeśli zadzwonisz f(1) otrzymasz kod specjalizuje Int64 - rodzaj 1 na systemach 64-bitowych; jeśli zadzwonisz pod numer f(1.0), otrzymasz wersję z nową wersją wyspecjalizowaną na Float64 - typ 1.0 we wszystkich systemach. Ponieważ każda skompilowana wersja funkcji wie, jakie typy będzie uzyskiwać, może działać z prędkością zbliżoną do C. Możesz go sabotować, pisząc i używając funkcji "typu niestabilnego", których typ zwracania zależy od danych wykonawczych, a nie tylko typów, ale staraliśmy się tego nie robić przy projektowaniu języka podstawowego i biblioteki standardowej.

Większość Julii jest pisana sama w sobie, a następnie przetwarzana, typowana i wprowadzana, więc uruchomienie całego systemu od zera zajmuje około 15-20 sekund. Aby przyspieszyć, dysponujemy systemem etapowym, w którym analizujemy składnię, wpisujemy, a następnie buforujemy zserializowaną wersję typu AST w pliku sys.ji. Ten plik jest następnie ładowany i używany do uruchamiania systemu po uruchomieniu julia. Żaden kod LLVM lub kod maszynowy nie jest buforowany w sys.ji, tak więc cały proces JL LVM musi być nadal wykonywany za każdym razem, gdy uruchamiany jest julia, co trwa około 2 sekund.

To 2-sekundowe opóźnienie uruchamiania jest dość denerwujące i mamy plan na jego naprawienie. Podstawowym planem jest możliwość kompilowania całych programów Julia do plików binarnych: albo pliki wykonywalne, które można uruchamiać, albo biblioteki współdzielone, które można wywoływać z innych programów tak, jakby były po prostu współdzielonymi bibliotekami C. Czas uruchomienia binarnego będzie jak każdy inny program C, więc 2-sekundowe opóźnienie uruchomienia zniknie.

Dodatek 1: Od listopada 2013 roku, wersja rozwój Julia nie ma już opóźnienie uruchomienia 2-sekundową ponieważ precompiles biblioteki standardowej postaci kodu binarnego. Czas uruchamiania jest nadal 10 razy wolniejszy niż w Pythonie i Ruby, więc jest miejsce na poprawę, ale jest dość szybki. Następnym krokiem będzie umożliwienie wstępnej kompilacji pakietów i skryptów, tak aby ci mogli uruchamiać się tak samo szybko jak sama Julia.

Dodatek 2: Od czerwca 2015 r. Deweloperska wersja Julii prekompiluje wiele pakietów automatycznie, umożliwiając szybkie ładowanie. Następnym krokiem jest statyczna kompilacja całych programów Julii.

+6

Widziałem wiele komentarzy w Internecie z zeszłego roku lub tak, wskazując, że skompilowane pliki wykonywalne/obiekty wspólne są celem dla Julia, ale bez wskazania postępu. Czy możesz zaoferować jakikolwiek wgląd w to, co na tym polega? – dfreeman

+2

Dużo postępów poczynili Jameson Nash i Isaiah Norton, ale jeszcze nie do końca. – StefanKarpinski

+23

Ta funkcja jest teraz kompletna i scalona na urządzeniu master Julia. Zamiast poświęcić ~ 1,5 sekundy na mój system, aby uruchomić Julię, zajmuje teraz ~ 150 milisekund - imponujące 10-krotne przyspieszenie. Jeśli uda nam się zgromadzić kolejne 10-krotne przyspieszenie, co jest całkowicie możliwe, czas uruchamiania Julii będzie porównywalny do czasu Rubiego i Pythona. – StefanKarpinski

Powiązane problemy