Instanciar objetos dentro de laços pode agregar um custo computacional desnecessário.
E quanto à declaração de variáveis. Existe alguma otimização no javac para que eu possa usar isso sem medo?
while(condicao){
}
Instanciar objetos dentro de laços pode agregar um custo computacional desnecessário.
E quanto à declaração de variáveis. Existe alguma otimização no javac para que eu possa usar isso sem medo?
while(condicao){
}
Desculpem-me. Esbarrei no botão enviar
while(condicao){
int x = getValor();
setOutroValor(x);
}
ao invés disso:
int x;
while(condicao){
x = getValor();
setOutroValor(x);
}
Sim fica mais caro.
Pergunta: para que você precisa declarar uma variável dentro de um laço?
*dica: tem um botão “editar” em cima à direita de qualquer tópico seu
Lembre-se que cada variavel ou objeto declarado consome um espaço na memória.
Há também o tempo para cada nova alocação.
Oh! Nunca tinha reparado esse botão! :oops:
Quando ao post, muitas fazemos coisas ineficientes a favor de elegância…
[quote=“vamorim”]Oh! Nunca tinha reparado esse botão! :oops:
Quando ao post, muitas fazemos coisas ineficientes a favor de elegância…[/quote]
Vc acha elegante declarar variaveis dentro de LOOPS? :shock: :shock:
O teu programa nao tera performance afetada a ponto de ser notada. Alias, muito longe disso
Declarar as variaveis fora do loop, sendo que voce somente ira usa-las dentro dele, pode dar alguns problemas relacionados a escopo, uma vez que a var ficara disponivel para o resto do bloco de codigo sem necessidade.
Rafael
PERAE PERAE PERAE!
Desde quando existe ALGUMA DIFERENCA entre declarar uma variavel num loop ou fora dela? O que doi nao eh declarar uma variavel, eh instanciar objetos, e mesmo assim nao doi tanto.
Pondo o meu na reta, aqui vai o codigo que eu usei como exemplo:
[code]public class Test {
public static void main(String[] args) {
m1();
m2();
}
public static void m1() {
for(int i = 0; i < 10; i++) {
System.out.println(i);
}
}
public static void m2() {
int i = 0;
for(; i<10; i++ ) {
System.out.println(i);
}
}
}
[/code]
E aqui vai um belo javap -c no bichinho:
[code]
public static void m1();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: bipush 10
5: if_icmpge 21
8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
11: iload_0
12: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
15: iinc 0, 1
18: goto 2
21: return
public static void m2();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: bipush 10
5: if_icmpge 21
8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
11: iload_0
12: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
15: iinc 0, 1
18: goto 2
21: return
}[/code]
Nao sei se voces notaram, mas NAO FAZ A MENOR DIFERENCA. Ponto final na discussao.
[quote=“cv”]
[code]public class Test {
public static void main(String[] args) {
m1();
m2();
}
public static void m1() {
for(int i = 0; i < 10; i++) {
System.out.println(i);
}
}
public static void m2() {
int i = 0;
for(; i<10; i++ ) {
System.out.println(i);
}
}
}
[/code]
Nao sei se voces notaram, mas NAO FAZ A MENOR DIFERENCA. Ponto final na discussao. ;)[/quote]
Mas acho que não é bem isso, e se fosse assim
public class Test {
public static void main(String[] args) {
m1();
m2();
}
public static void m1() {
int i2 = 0;
for(int i = 0; i < 10; i++) {
i2 = i;
System.out.println(i2);
}
}
public static void m2() {
int i = 0;
for(; i<10; i++ ) {
int i2 = i;
System.out.println(i2);
}
}
}
Mesmo pq da forma que vc colocou o For declara a variavel apenas uma vez.
Abraços.
O custo de declarações locais é ZERO em termos de instruções utilizadas pela CPU para alocação de espaço. Outra coisa é o custo de inicializar essas variaveis.
Uma variavel nao pode ser declarada mais de uma vez, ou voce teria um erro de compilacao (leia esta frase de novo caso em caso de viagem na maionese :D). Ela pode ser inicializada uma unica vez, e escrita/lida quantas vezes voce quiser.
Então o que significa efetivamente fazer
while(condicao){
int x = 5;
}
Dei um javap - c no teste do rogeriop80 mais acho que ainda não me caiu a ficha…
Bom, de acordo com o codigo do Rogerio:
public static void m3() {
while(b) {
int x = 5;
System.out.println(x);
}
}
public static void m4() {
int x = 0;
while(b) {
x = 5;
System.out.println(x);
}
}
Saida do javap, explicadinha:
public static void m3();
Code:
0: getstatic //pega o 'b', que eu declarei so pra ter o que testar
3: ifeq 18 // b == true?
6: iconst_5 // declara a constante '5'
7: istore_0 // armazena '5' em 'x'
8: getstatic // acessa System.out
11: iload_0 // carrega o 'out' na pilha
12: invokevirtual //chama o metodo
15: goto 0 // vai pro 0 :P
18: return
public static void m4();
Code:
0: iconst_0 // declara a constante '0'
1: istore_0 // armazena '0' em 'x'
2: getstatic //pega o 'b', que eu declarei so pra ter o que testar
5: ifeq 20 // b == true?
8: iconst_5 // declara a constante '5'
9: istore_0 // armazena 5 em 'x'
10: getstatic // acessa System.out
13: iload_0 // carrega o 'out' na pilha
14: invokevirtual //chama o metodo
17: goto 2 // vai pro passo 2 :P
Melhorou a queda da ficha?
Achei que cada vez que finzlizasse um loop, ele matava todas as variaveis.
Entao, qdo declaro no começo de um looping uma variavel X , ao voltar pro começo no proximo loop, essa variavel nao existisse mais…
Logo, ele sempre teria o mesmo numero de bytes ocupado em memoria…
Certo ?
Ficha? Ué, cadê ela? Acho que caiu por aí…
Faleu!
Se você quer declarar a variavel dentro do loop declare e fique com seu programa sujo… Ou faça uma coisa direita e declare fora… Para ter acesso no resto de seu programa…
Acho que elegância não uma coisa muito universal. Muita gente pode achar que o segundo código abaixo é mais elegante…
int x;
int y;
int z;
double d1;
double d2;
double d3;
double d4;
String s1;
String s2;
String s3;
for(int i = 0; i < 10; i++){
x = getX();
y = getY();
d1= getD1();
d2 = getD2();
d3 = getD3();
d4 = getD4();
s1 = getS1();
s2 = getS2();
z = x * iy;
d3 = d1-d2;
d4 = d1+d3;
s3 = s1+s2;
setZ(z);
setD3(d3);
setD4(d4);
setS3(s3);
}
for(int i = 0; i < 10; i++){
int x = getX();
int y = getY();
int z = x * y;
double d1= getD1();
double d2 = getD2();
double d3 = d1- d2;
double d4 = d1- d3;
String s1 = getS1();
String s2 = getS2();
setZ(z);
setD3(d3);
setD4(d4);
setS3(s3);
}
Vinci, eu sei que essa discussao vai longe, mas aqui estao meus argumentos sobre a minha preferencia pela 2a versao:
:arrow: Codigo mais curto eh mais facil de ler e mais rapido de compilar (nao que essa ultima la seja uma graaaande vantagem)
:arrow: Evita os erros de compilacao do tipo “a variavel pode nao ter sido inicializada”
:arrow: Eh mais simples de ler - requer a leitura de apenas uma linha (ao inves de duas, com uma distancia consideravel) para entender pra que a variavel serve
:arrow: Nao tem aquele cheiro ruim de Pascal ou de Portugol
Ha alguns dias eu estava pensando sobre um negocio semelhante… declaracao dentro de loops de variaveis tipo objeto (referencias).
Exemplo:
Obj o = null;
while (condicao) {
o = new Obj();
...
list.add(o);
}
while (condicao) {
Obj o = new Obj();
...
list.add(o);
}
A quantidade de objetos em memoria eh a mesma. Porem a cada iteracao eh criada uma nova referencia (“ponteiro”) para um objeto do tipo Obj… esta correto isso? Ou as referencias sao sempre as mesmas?
Nesse caso quanto espaco ocupa uma referencia dessas em termos de memoria?
Marcio Kuchma