Zrobiłem kilka generowania kodu bajtowego przy użyciu ASM.
Przechodząc przez jakieś AST jakiegoś małego DSL w układzie odwiedzającego.
Obawiam się, że wygenerowany kod bajtowy jest zbyt "prosty", to znaczy bez "optymalizacji czasu kompilacji".
Chociaż w moim przypadku może to być ok, jeśli wygenerowany kod bajtu nie jest zoptymalizowany, nadal nie mogę pomóc, aby zapytać: czy istnieje potrzeba tych projektów, które generują kod bajtowy w czasie wykonywania w celu optymalizacji kodu bajtowego?
Wiem, że dla jvm większość pracy "optymalizacyjnej" jest wykonywana podczas działania programu, przez kompilację jit. Zatem optymalizacja kodu bajtowego w czasie kompilacji może mieć niewielki wpływ.
Ale, naprawdę? Czy nie ma absolutnie sensu optymalizacja kodu bajtowego dla kodu bajtowego generowanego w locie? Czy jest ktoś, kto mógłby podzielić się doświadczeniami na temat różnicy, głównie w wydajności środowiska wykonawczego, między bajtami zi bez jakiejkolwiek formy optymalizacji?Czy dynamicznie generowany kod bajtowy java wymaga jakiejkolwiek optymalizacji?
Odpowiedz
Wiem, że co najmniej jeden język oparty na JVM, którego udział pozostaje bezimienny, jest powolny jak diabli. Mógł użyć jakiejś optymalizacji czasu kompilacji.
Javac i JVM analizują z grubsza ten sam model programowania, dlatego też wszelkie techniki optymalizacji, które może stosować Javac, mogą być również wykorzystywane przez JVM. W takim przypadku Javac nie ma sensu powielać pracy. Właściwie prawdopodobnie preferuje się, aby Javac pozostawił tyle struktury kodu źródłowego, jak to możliwe, aby JVM mogła lepiej zrozumieć kod.
Nie ma to zastosowania, jeśli język źródłowy nie jest językiem Java.
Pomyślcie o tym, procesor ma także wiele wspaniałej optymalizacji, więc dlaczego JVM musi wykonać jakąkolwiek optymalizację? Dlaczego nie zostawić wszystkiego procesorowi. Ponieważ CPU i JVM analizują bardzo różne kody. CPU analizuje dowolną sekwencję instrukcji maszynowych (choć może przyjąć założenia oparte na typowych zachowaniach języków wysokiego poziomu). JVM analizuje bardzo specyficzny, o wiele wyższy poziom języka, JVM może rozumować i przekształcać kod na podstawie wiedzy, która jest prawie niemożliwa do wykrycia przez procesor z instrukcji maszyny.
Wracając do Twojej sprawy, możliwe, że Ty (jako kompilator) dużo lepiej wiesz o swoim języku źródłowym o wyższym poziomie, możesz wykonywać przekształcenia, które są niemożliwe przez JVM.
Świetne wyjaśnienie! Myślę, że zrozumiałem twój punkt widzenia, to mnie otrzeźwia. Tak więc, jeśli mój DSL wprowadza wyższy model programowania - logikę boolowską w jakiejś formie "silnika reguł" na przykład, mógłbym dokonać pewnych optymalizacji w logice logiki boolowskiej, takich jak "optymalizacja logiczna bramki". Ale jeśli moje DSL jest po prostu kolejnym zamkniętym imperatywnym językiem programowania, podobnie jak java, nie ma potrzeby przeprowadzania optymalizacji, prawda? –
Nie jest to konieczne.
Jeśli spojrzeć na wyjście Javaca, nie ma praktycznie żadnej optymalizacji czasu kompilacji w ogóle. A dzięki JIT Hotspota, trudno jest określić, jaki wpływ i tak będzie miała zmiana kodu bajtowego na optymalizację. Najlepiej nie martwić się o takie rzeczy, chyba że uda ci się udowodnić, że istnieje prawdziwe wąskie gardło i masz czas, aby to zbadać.
- 1. Jak mogę zobaczyć kod generowany przez HotSpot po optymalizacji?
- 2. Demontaż Java JIT skompilowany natywny kod bajtowy
- 3. Sprawdź, czy kod bajtowy Java zawiera symbole debugowania
- 4. Dynamicznie generowany GUI
- 5. Java dla optymalizacji pętli
- 6. Jak pisać przyjazny kod optymalizacji Java JIT?
- 7. Przywracanie stanu przeglądania stron internetowych zawierającego dynamicznie generowany kod HTML
- 8. GHC Core jako "kod bajtowy"?
- 9. Kod bajtowy wykrywający język Python
- 10. Jak sprawdzić kod bajtowy Pythona?
- 11. Dlaczego kod bajtowy java "zapisz" często następuje po "załadowaniu"?
- 12. Jak emitować i wykonywać kod bajtowy Java w czasie wykonywania?
- 13. Dlaczego setuptools muszą pisać kod bajtowy?
- 14. Jak sprawdzić kod bajtowy java wygenerowany przez Clojure z rep?
- 15. Czy cały kod bajtowy skompilowany ze źródeł java może zostać zdekompilowany do źródeł java?
- 16. Kod generowany przez wsimport - najlepsza praktyka dla pakowania kod
- 17. Co oznacza pozbawiony JAR (nie kod bajtowy dla metod)?
- 18. Czy jest jakiś sposób programowo wygenerować kod bajtowy Pythona?
- 19. optymalizacji kompilatora Java String
- 20. powolny kod bajtowy z ogona rekurencji
- 21. Zinterpretować coś i uruchomić wygenerowany kod bajtowy w Javie?
- 22. Zrozumienie kod generowany przez Yesod Trwałych TH
- 23. Czy kod Java jest kompatybilny z bajtami w ramach różnych aktualizacji tej samej wersji Java?
- 24. Dlaczego jest generowany leniwy łańcuch Java String?
- 25. Przestarzałe wskazówki dotyczące optymalizacji Java
- 26. Załaduj kod bajtów Java w środowisku wykonawczym
- 27. Jak napisać efektywny kod Java?
- 28. Usuń dynamicznie generowany plik PDF natychmiast po wyświetleniu użytkownikowi
- 29. Czy jest to pomocne optymalizacji pętli w java?
- 30. Dynamicznie generowany skrypt JavaScript, CSS w ASP.NET MVC
Możesz spróbować hardcoding przykład i ścigać się z generatora kodu bajtowego ... –
Jeśli twój kawałek kodu nie jest uruchamiany bardzo często, nie zostanie zoptymalizowany przez JIT, ale to nie ma znaczenia, ponieważ nie biegać bardzo często. A jeśli często będzie działać, zostanie zoptymalizowany. Wszyscy są szczęśliwi. – assylias
Proszę spojrzeć na ten http://stackoverflow.com/a/1680212/655756. Innymi słowy, możesz robić dalsze optymalizacje, ale nie jest to konieczne, ponieważ zwykle te optymalizacje wyglądają bardziej jak "kosmetyczne". – n1ckolas