Dudo que haya una manera de crear condiciones en tiempo de compilación en Java como #ifdef #ifndef en C ++.
Mi problema es que tengo un algoritmo escrito en Java, y tengo diferentes mejoras de tiempo de ejecución para ese algoritmo. Por eso quiero medir cuánto tiempo ahorro cuando se usa cada mejora.
En este momento tengo un conjunto de variables booleanas que se utilizan para decidir durante el tiempo de ejecución qué mejora se debe utilizar y cuál no. Pero incluso probar esas variables influye en el tiempo total de ejecución.
Así que quiero encontrar una manera de decidir durante el tiempo de compilación qué partes del programa deben compilarse y usarse.
¿Alguien sabe una forma de hacerlo en Java? O tal vez alguien sepa que no existe tal forma (también sería útil).
javac
Creo que el código fue eliminado . Esto solo funcionó si la expresión para (digamos)enableFast
era una expresión constante de tiempo de compilación.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac no generará código compilado que sea inalcanzable. Utilice una variable final establecida en un valor constante para su
#define
y unaif
declaración normal para#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:
javap -c Test
da el siguiente resultado, lo que indica que solo se compiló una de las dos rutas (y la declaración if no):fuente
Creo que encontré la solución, es mucho más simple.
Si defino las variables booleanas con el modificador "final", el propio compilador de Java resuelve el problema. Porque sabe de antemano cuál sería el resultado de probar esta condición. Por ejemplo este código:
se ejecuta aproximadamente 3 segundos en mi computadora.
Y éste
dura aproximadamente 1 segundo. El mismo tiempo que tarda este código
fuente
Nunca lo usé, pero esto existe
http://www.anarres.org/projects/jcpp/
fuente
Si realmente necesita una compilación condicional y usa 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 se puede, por ejemplo, escribir un filtro para reemplazar
LOG.debug(...);
con/*LOG.debug(...);*/
. Esto aún se ejecutaría más rápido que lasif (LOG.isDebugEnabled()) { ... }
cosas, sin mencionar que sería más conciso al mismo tiempo.Si usa Maven , hay una función similar que se describe aquí .
fuente
Manifold proporciona un preprocesador Java completamente integrado (sin pasos de compilación ni fuente generada). Se dirige exclusivamente a la compilación condicional y utiliza directivas de estilo C.
fuente
¿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 período de tiempo de ejecución prolongado, el mayor componente del tiempo invertido debería estar en el algoritmo principal ahora, ¿no es así?
Estrictamente hablando, realmente no necesita un preprocesador para hacer lo que busca lograr. Lo más probable es que existan otras formas de cumplir con sus requisitos además de la que he propuesto, por supuesto.
fuente
fuente