Я сомневаюсь, что есть способ создать условия времени компиляции в Java, такие как #ifdef #ifndef в C ++.
Моя проблема в том, что у меня есть алгоритм, написанный на Java, и у меня другое время работы улучшается для этого алгоритма. Поэтому я хочу измерить, сколько времени я экономлю при использовании каждого улучшения.
Прямо сейчас у меня есть набор логических переменных, которые используются для решения во время работы, какие улучшения следует использовать, а какие нет. Но даже тестирование этих переменных влияет на общее время работы.
Итак, я хочу найти способ решить во время компиляции, какие части программы следует компилировать и использовать.
Кто-нибудь знает, как это сделать на Java. А может кто знает, что такого способа нет (тоже было бы полезно).
javac
я думаю. Это работало, только если выражение для (скажем)enableFast
было выражением константы времени компиляции.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac не будет выводить скомпилированный код, который недоступен. Используйте конечную переменную, для которой задано постоянное значение для вашего,
#define
и обычныйif
оператор для#ifdef
.Вы можете использовать javap, чтобы доказать, что недостижимый код не включен в выходной файл класса. Например, рассмотрим следующий код:
javap -c Test
дает следующий результат, указывающий, что только один из двух путей был скомпилирован (а оператор if - нет):источник
Думаю, что нашел решение, все намного проще.
Если я определю логические переменные с помощью модификатора final, компилятор Java решит проблему. Потому что он заранее знает, каков будет результат проверки этого условия. Например этот код:
работает около 3 секунд на моем компьютере.
И этот
работает около 1 секунды. В то же время этот код занимает
источник
Никогда не использовал, но он существует
http://www.anarres.org/projects/jcpp/
источник
Если вам действительно нужна условная компиляция и вы используете Ant , вы можете фильтровать свой код и выполнять в нем поиск и замену.
Например: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
Таким же образом вы можете, например, написать фильтр для замены
LOG.debug(...);
с/*LOG.debug(...);*/
. Это все равно будет выполняться быстрее, чемif (LOG.isDebugEnabled()) { ... }
все остальное, не говоря уже о том, чтобы быть в то же время более кратким.Если вы используете Maven , есть подобная функция описана здесь .
источник
Manifold предоставляет полностью интегрированный препроцессор Java (без шагов сборки или сгенерированного исходного кода). Он предназначен исключительно для условной компиляции и использует директивы в стиле C.
источник
Использовать фабричный шаблон для переключения между реализациями класса?
Время создания объекта не может быть проблемой сейчас, не так ли? При усреднении за длительный период времени самая большая часть затраченного времени должна быть теперь в основном алгоритме, не так ли?
Строго говоря, вам не нужен препроцессор, чтобы делать то, чего вы хотите достичь. Скорее всего, есть другие способы удовлетворить ваши требования, чем тот, который я, конечно, предложил.
источник
источник