2013-03-09 17 views
5

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?

+0

Możesz spróbować hardcoding przykład i ścigać się z generatora kodu bajtowego ... –

+0

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

+0

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

Odpowiedz

2

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.

+0

Ś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? –

0

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ć.

Powiązane problemy