Eu tenho uma pergunta sobre a criação de novo objeto em java.
Vamos dizer que eu tenho methos chamado: foo(String[] a)
Eu quero passar para foo
um novo String[]
isso é apenas para um uso o que é melhor para
desempenho 1 ou 2
1.
String[] a = new String[]{"a"};
foo(a);
2.
foo(new String[]{"a"});
Obrigado por ajudar
Respostas:
8 para resposta № 1Você pode verificar o bytecode:
1.
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: anewarray #2 // class java/lang/String
4: astore_1
5: aload_1
6: invokestatic #3 // Method foo:([Ljava/lang/String;)V
9: return
2.
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: anewarray #2 // class java/lang/String
4: invokestatic #3 // Method foo:([Ljava/lang/String;)V
7: return
A única diferença é que, em (2), nenhuma referência é armazenada (astore_1
) e nenhum precisa ser carregado (aload_1
) Isso certamente não causará uma diferença de desempenho (e você não deve se preocupar com essas otimizações minúsculas de qualquer maneira), mas você também pode usar a opção (2) se não quiser fazer referência a
novamente no programa (como você mencionou em seu comentário) e não há violação de legibilidade.
Eu acho que o componente de legibilidade é bastanteimportante: eu preferiria criar uma variável para armazenar a matriz (mesmo que nunca faça referência a essa variável mais de uma vez) do que ter uma linha super longa e ilegível. Obviamente, no seu exemplo, não há problema de legibilidade. , mas é algo a considerar quando surgirem situações mais complicadas.
3 para resposta № 2
Ter variáveis locais temporárias posso ajude o desempenho se você os usar para armazenar valores freqüentemente usados e caros de calcular. Para valores únicos, eles ainda podem ser uma grande ajuda para nomeação um valor e deixando clara sua intenção - e o custo de desempenho será absolutamente insignificante.
Ter ou não ter uma variável para armazenar umo valor único é irrelevante em termos de desempenho, concentre seus esforços nas partes do código destacadas como gargalos por um criador de perfil e não perca seu tempo em micro otimizações irrelevantes. E é mais importante escrever código fácil de entender, lembre-se ... "a otimização prematura é a raiz de todo mal".
1 para resposta № 3
Não acho que seja possível responder definitivamente à pergunta de uma maneira geral. Até a resposta do arshajii mostrando a IL é limitada.
No seu código, o compilador JIT otimizará isso de qualquer maneira.
O nível de otimização dependerá muito de coisas como versão, plataforma, implementação e um milhão de outras variáveis.
... agora, se você tivesse uma cerca de leitura entre os dois, para que a instabilidade não pudesse otimizá-los, você teria uma história diferente.