Как James (hopkin), для меня, гибридный подход является лучшим решением. Python и C++ являются хорошим выбором, но другим стилем как C#/C ++ работы. Все зависит Вашего графического контекста. Для игры XNA является хорошей платформой (ограниченный win32), в этом случае C#/C ++ является лучшим решением. Для аналитической визуализации Python/C++ принят (как привязка vtk в Python). Для игры для мобильных устройств JAVA/C++ может работы...
private static final boolean enableFast = false;
// ...
if (enableFast) {
// This is removed at compile time
}
Условные выражения, подобные показанным выше, оцениваются во время компиляции. Если вместо этого вы используете это
private static final boolean enableFast = "true".equals(System.getProperty("fast"));
, то любые условия, зависящие от enableFast, будут оцениваться JIT-компилятором. Накладные расходы для этого незначительны.
javac не будет выводить скомпилированный код, который недоступен. Используйте конечную переменную, для которой задано постоянное значение для вашего #define
и обычный if
оператор для #ifdef
.
Вы можете использовать javap для доказательства что недостижимый код не включен в выходной файл класса. Например, рассмотрим следующий код:
public class Test
{
private static final boolean debug = false;
public static void main(String[] args)
{
if (debug)
{
System.out.println("debug was enabled");
}
else
{
System.out.println("debug was not enabled");
}
}
}
javap -c Test
дает следующий результат, указывающий, что только один из двух путей был скомпилирован (а оператор if - нет):
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String debug was not enabled
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
Я думаю, что нашел решение, оно намного проще.
Если я определю логические переменные с помощью модификатора final, компилятор Java решит проблему. Потому что он заранее знает, каков будет результат проверки этого условия.
Например, этот код:
boolean flag1 = true;
boolean flag2 = false;
int j=0;
for(int i=0;i<1000000000;i++){
if(flag1)
if(flag2)
j++;
else
j++;
else
if(flag2)
j++;
else
j++;
}
выполняется на моем компьютере около 3 секунд.
А этот
final boolean flag1 = true;
final boolean flag2 = false;
int j=0;
for(int i=0;i<1000000000;i++){
if(flag1)
if(flag2)
j++;
else
j++;
else
if(flag2)
j++;
else
j++;
}
длится около 1 секунды. В то же время этот код занимает
int j=0;
for(int i=0;i<1000000000;i++){
j++;
}
Никогда не использовал, но он существует
JCPP является полным, совместимым, автономная реализация на чистом Java препроцессора C. Это предназначено быть полезным для людей, пишущих в стиле C компиляторы на Java с использованием таких инструментов, как sablecc, antlr, JLex, CUP и т. д. вперед. Этот проект был использован для успешной предварительной обработки большей части исходный код библиотеки GNU C. Как версии 1.2.5, он также может предварительно обработать Apple Objective C библиотека.
Использовать заводской шаблон для переключения между реализациями класса?
Время создания объекта не может быть проблемой сейчас, не так ли? При усреднении за длительный период времени самая большая часть затраченного времени должна быть теперь в основном алгоритме, не так ли?
Строго говоря, вам действительно не нужен препроцессор, чтобы делать то, чего вы хотите достичь. Скорее всего, есть другие способы удовлетворить ваши требования, чем тот, который я, конечно, предложил.