Wątpię, czy istnieje sposób na stworzenie warunków czasu kompilacji w Javie, takich jak #ifdef #ifndef w C ++.
Mój problem polega na tym, że mam algorytm napisany w Javie i mam inny czas pracy, który poprawia ten algorytm. Chcę więc zmierzyć, ile czasu oszczędzam, gdy wykorzystuję każdą poprawę.
W tej chwili mam zestaw zmiennych logicznych, które są używane do decydowania w czasie wykonywania, które ulepszenia powinny być używane, a które nie. Ale nawet testowanie tych zmiennych wpływa na całkowity czas pracy.
Dlatego chcę znaleźć sposób na podjęcie decyzji w czasie kompilacji, które części programu powinny zostać skompilowane i użyte.
Czy ktoś zna sposób na zrobienie tego w Javie. A może ktoś wie, że nie ma takiego sposobu (też by się przydał).
javac
Myślę, że kod został usunięty . To działało tylko wtedy, gdy wyrażenie for (powiedzmy)enableFast
było wyrażeniem stałej czasu kompilacji.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac nie wyświetli skompilowanego kodu, który jest nieosiągalny. Użyj końcowej zmiennej ustawionej na stałą wartość dla swojej
#define
i zwykłejif
instrukcji dla#ifdef
.Możesz użyć javap, aby udowodnić, że nieosiągalny kod nie jest zawarty w pliku klasy wyjściowej. Weźmy na przykład pod uwagę następujący kod:
javap -c Test
daje następujący wynik, wskazując, że tylko jedna z dwóch ścieżek została wkompilowana (a instrukcja if nie była):źródło
Myślę, że znalazłem rozwiązanie, jest znacznie prostsze.
Jeśli zdefiniuję zmienne boolowskie za pomocą "końcowego" modyfikatora, sam kompilator Javy rozwiązuje problem. Ponieważ wie z góry, jaki byłby wynik przetestowania tego warunku. Na przykład ten kod:
działa około 3 sekund na moim komputerze.
I ten
kursuje około 1 sekundy. W tym samym czasie zajmuje ten kod
źródło
Nigdy go nie używałem, ale to istnieje
http://www.anarres.org/projects/jcpp/
źródło
Jeśli naprawdę potrzebujesz kompilacji warunkowej i używasz Ant , możesz być w stanie przefiltrować swój kod i wykonać w nim wyszukiwanie i zamianę.
Na przykład: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
W ten sam sposób można na przykład napisać filtr do wymiany
LOG.debug(...);
z/*LOG.debug(...);*/
. To i tak działałoby szybciej niżif (LOG.isDebugEnabled()) { ... }
rzeczy, nie wspominając o tym, że jest jednocześnie bardziej zwięzłe.Jeśli używasz Mavena , tutaj opisano podobną funkcję .
źródło
Manifold zapewnia w pełni zintegrowany preprocesor Java (bez kroków kompilacji ani wygenerowanego źródła). Jest przeznaczony wyłącznie do kompilacji warunkowej i używa dyrektyw w stylu C.
źródło
Użyć wzorca fabryki do przełączania się między implementacjami klasy?
Czas tworzenia obiektu nie może być teraz problemem, prawda? Po uśrednieniu z długiego okresu czasu, największy składnik czasu spędzonego powinien teraz znajdować się w głównym algorytmie, prawda?
Ściśle mówiąc, tak naprawdę nie potrzebujesz preprocesora, aby zrobić to, co chcesz osiągnąć. Najprawdopodobniej istnieją inne sposoby spełnienia twoich wymagań niż ten, który oczywiście zaproponowałem.
źródło
źródło