Duvido que haja uma maneira de criar condições de tempo de compilação em Java como #ifdef #ifndef em C ++.
Meu problema é que tenho um algoritmo escrito em Java, e tenho diferentes melhorias de tempo de execução para esse algoritmo. Portanto, quero medir quanto tempo economizo quando cada melhoria é usada.
No momento eu tenho um conjunto de variáveis booleanas que são usadas para decidir durante o tempo de execução quais melhorias devem ser usadas e quais não. Mas mesmo o teste dessas variáveis influencia o tempo total de execução.
Portanto, quero descobrir uma maneira de decidir durante o tempo de compilação quais partes do programa devem ser compiladas e usadas.
Alguém conhece uma maneira de fazer isso em Java. Ou talvez alguém saiba que não existe tal caminho (também seria útil).
javac
eu acho. Isso funcionava apenas se a expressão para (digamos)enableFast
fosse uma expressão de constante de tempo de compilação.private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac não produzirá código compilado que esteja inacessível. Use uma variável final definida com um valor constante para seu
#define
e umaif
declaração normal para o#ifdef
.Você pode usar o javap para provar que o código inacessível não está incluído no arquivo de classe de saída. Por exemplo, considere o seguinte código:
javap -c Test
fornece a seguinte saída, indicando que apenas um dos dois caminhos foi compilado (e a instrução if não foi):fonte
Acho que encontrei a solução, é muito mais simples.
Se eu definir as variáveis booleanas com o modificador "final", o próprio compilador Java resolve o problema. Porque sabe de antemão qual seria o resultado do teste dessa condição. Por exemplo, este código:
corre cerca de 3 segundos no meu computador.
E este
corre cerca de 1 segundo. O mesmo tempo que este código leva
fonte
Nunca usei, mas existe
http://www.anarres.org/projects/jcpp/
fonte
Se você realmente precisa de compilação condicional e usa Ant , pode filtrar seu código e fazer uma busca e substituição nele.
Por exemplo: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
Da mesma forma você pode, por exemplo, escrever um filtro para substituir
LOG.debug(...);
com/*LOG.debug(...);*/
. Isso ainda seria executado mais rápido do queif (LOG.isDebugEnabled()) { ... }
outras coisas, sem mencionar que seria mais conciso ao mesmo tempo.Se você usa o Maven , há um recurso semelhante descrito aqui .
fonte
O Manifold fornece um pré-processador Java totalmente integrado (sem etapas de construção ou fonte gerada). Ele visa exclusivamente a compilação condicional e usa diretivas de estilo C.
fonte
Usar o Padrão de Fábrica para alternar entre as implementações de uma classe?
O tempo de criação do objeto não pode ser uma preocupação agora, pode? Quando calculada a média de um longo período de tempo de execução, o maior componente de tempo gasto deve estar no algoritmo principal agora, não é?
Estritamente falando, você realmente não precisa de um pré-processador para fazer o que você busca alcançar. Provavelmente, há outras maneiras de atender às suas necessidades além da que propus, é claro.
fonte
fonte