# ifdef # ifndef en Java


Dudo que haya una manera de crear condiciones de tiempo de compilación en Java como #ifdef #ifndef en C++.

Mi problema es que tener un algoritmo escrito en Java, y tengo tiempo de ejecución diferente mejora a ese algoritmo. Así que quiero medir cuánto tiempo ahorro cuando se usa cada mejora.

Ahora mismo tengo un conjunto de variables booleanas que se utilizan para decidir durante el tiempo de ejecución qué mejorar se debe utilizar y cuáles no. Pero incluso probar esas variables influye en la tiempo total de ejecución.

Así que quiero encontrar una manera de decidir durante el tiempo de compilación qué partes del programa deben ser compiladas y utilizadas.

Alguien sabe una manera de hacerlo en Java. O tal vez alguien sabe que no hay tal manera (también sería útil).

Author: jldupont, 2009-11-29

7 answers

private static final boolean enableFast = false;

// ...
if (enableFast) {
  // This is removed at compile time
}

Los condicionales como los mostrados arriba se evalúan en tiempo de compilación. Si en su lugar se utiliza este

private static final boolean enableFast = "true".equals(System.getProperty("fast"));

Entonces cualquier condición dependiente de enableFast será evaluada por el compilador JIT. Los gastos generales para esto son insignificantes.

 118
Author: Mark Thornton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-08 07:51:34

Javac no generará código compilado que sea inalcanzable. Utilice una variable final establecida en un valor constante para su #define y una instrucción normal if para el #ifdef.

Puede usar javap para demostrar que el código inalcanzable no está incluido en el archivo de clase de salida. Por ejemplo, considere el siguiente código:

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 da la siguiente salida, indicando que solo una de las dos rutas fue compilada (y la instrucción if no lo fue):

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
 41
Author: Phil Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-28 23:36:07

Creo que he encontrado la solución, es mucho más simple.
Si defino las variables booleanas con el modificador" final " Java compiler resuelve el problema. Porque sabe de antemano cuál sería el resultado de probar esta condición. Por ejemplo este código:

    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++;
    }

Se ejecuta aproximadamente 3 segundos en mi computadora.
Y este

    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++;
    }

Dura aproximadamente 1 segundo. El mismo tiempo que este código toma

    int j=0;
    for(int i=0;i<1000000000;i++){
        j++;
    }
 11
Author: jutky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-19 23:27:37

Nunca lo usé, pero esto existe

JCPP es un completo, compatible, implementación independiente y pura de Java del preprocesador C. Se pretende ser de utilidad para las personas que escriben estilo C compiladores en Java usando herramientas como sablecc, antlr, JLex, TAZA y tan adelante. Este proyecto ha sido utilizado para preprocesar con éxito gran parte de la código fuente de la biblioteca C de GNU. Como de la versión 1.2.5, también puede preprocesar el Objetivo C de Apple biblioteca.

Http://www.anarres.org/projects/jcpp /

 2
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-28 21:40:53

Si realmente necesita compilación condicional y utiliza Ant, es posible que pueda filtrar su código y hacer una búsqueda y reemplazo en él.

Por ejemplo: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html

De la misma manera puede, por ejemplo, escribir un filtro para reemplazar LOG.debug(...); por /*LOG.debug(...);*/. Esto permitiría ejecutar más rápido que if (LOG.isDebugEnabled()) { ... } cosas, por no hablar de ser más conciso al mismo tiempo.

Si usa Maven , hay una característica similar descrita aquí.

 2
Author: rustyx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:31

¿Usar el Patrón de fábrica para cambiar entre implementaciones de una clase?

El tiempo de creación del objeto no puede ser una preocupación ahora, ¿verdad? Cuando se promedia durante un largo período de tiempo de ejecución, el mayor componente del tiempo empleado debería estar en el algoritmo principal, ¿no es así?

Estrictamente hablando, realmente no necesitas un preprocesador para hacer lo que buscas lograr. Lo más probable es que haya otras formas de cumplir con su requisito que la que he propuesto, por supuesto.

 1
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-28 21:49:10
final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0
 0
Author: alicanbatur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 12:45:22