public class TestClass {
public TestClass() { }
public int test(final int a){ return a; }
}
decompilado:
// Processed by NMI's Java Code Viewer 5.0 © 1997-2001 B. Lemaire
// Website: http://njcv.htmlplanet.com E-mail: [EMAIL PROTECTED]
// Copy registered to Evaluation Copy
// Source File Name: TestClass.java
public class TestClass {
public TestClass() {
}
public int test(int a) {
return a;
}
}
Bytecode:
Dumping bytecodes for:
public void TestClass()
Code( max_stack = 1, max_locals = 1, code_length = 5)
0 :042 (0x2a) aload_0 // Load object reference from local variable 0
1 :183 (0xb7) invokespecial java.lang.Object <init> ()V (1) // Invoke non-virtual method
4 :177 (0xb1) return // Return (void) from function
Attribute(s) =
2 LineNumber(s):
LineNumber( 0, 14 )
LineNumber( 4, 15 )
1 Local(s):
LocalVariable( start_pc = 0, length = 5, index = 0 : TestClass this
Bytcode dump ends
Dumping bytecodes for:
public int test(int)
Code( max_stack = 1, max_locals = 2, code_length = 2)
0 :027 (0x1b) iload_1 // Load integer from local variable 1
1 :172 (0xac) ireturn // Return integer from function
Attribute(s) =
1 LineNumber(s):
LineNumber( 0, 18 )
2 Local(s):
LocalVariable( start_pc = 0, length = 2, index = 1 : int a
LocalVariable( start_pc = 0, length = 2, index = 0 : TestClass this
Bytcode dump ends
Outra coisa, o javac ve public int test(int a) e public int test(final int a) como methodos com assinaturas iguais o que deixa colcluir que a palaver chave final e negada dentro de parameterlist de um methodo. (Que vc já deve ter percebido já que você esta usando dois methodos com nomes diferentes)
Veja aqui o bytecode do exemplo do Leonardo:
Dumping bytecodes for:
public int fazX(java.util.Vector)
Code( max_stack = 3, max_locals = 4, code_length = 34)
0 :003 (0x03) iconst_0 // Push integer constant 0
1 :061 (0x3d) istore_2 // Store integer into local variable 2
2 :003 (0x03) iconst_0 // Push integer constant 0
3 :062 (0x3e) istore_3 // Store integer into local variable 3
4 :029 (0x1d) iload_3 // Load integer from local variable 3
5 :043 (0x2b) aload_1 // Load object reference from local variable 1
6 :182 (0xb6) invokevirtual java.util.Vector size ()I (2) // Invoke method
9 :162 (0xa2) if_icmpge 32 // Branch if integers greater than or equal to
12 :028 (0x1c) iload_2 // Load integer from local variable 2
13 :043 (0x2b) aload_1 // Load object reference from local variable 1
14 :029 (0x1d) iload_3 // Load integer from local variable 3
15 :182 (0xb6) invokevirtual java.util.Vector get (I)Ljava/lang/Object; (3) // Invoke method
18 :192 (0xc0) checkcast <java/lang/Integer> (4) // Make sure object is of given type
21 :182 (0xb6) invokevirtual java.lang.Integer intValue ()I (5) // Invoke method
24 :096 (0x60) iadd // Integer add
25 :061 (0x3d) istore_2 // Store integer into local variable 2
26 :132 (0x84) iinc <stack> 3 1 // Increment local variable by constant
29 :167 (0xa7) goto 4 // Branch always
32 :028 (0x1c) iload_2 // Load integer from local variable 2
33 :172 (0xac) ireturn // Return integer from function
Attribute(s) =
5 LineNumber(s):
LineNumber( 0, 17 )
LineNumber( 2, 18 )
LineNumber( 12, 19 )
LineNumber( 26, 18 )
LineNumber( 32, 21 )
4 Local(s):
LocalVariable( start_pc = 0, length = 34, index = 1 : java.util.Vector v
LocalVariable( start_pc = 0, length = 34, index = 0 : TestClass this
LocalVariable( start_pc = 2, length = 32, index = 2 : int sum
LocalVariable( start_pc = 4, length = 28, index = 3 : int i
Bytcode dump ends
Dumping bytecodes for:
public int fazXFinal(java.util.Vector)
Code( max_stack = 3, max_locals = 4, code_length = 34)
0 :003 (0x03) iconst_0 // Push integer constant 0
1 :061 (0x3d) istore_2 // Store integer into local variable 2
2 :003 (0x03) iconst_0 // Push integer constant 0
3 :062 (0x3e) istore_3 // Store integer into local variable 3
4 :029 (0x1d) iload_3 // Load integer from local variable 3
5 :043 (0x2b) aload_1 // Load object reference from local variable 1
6 :182 (0xb6) invokevirtual java.util.Vector size ()I (2) // Invoke method
9 :162 (0xa2) if_icmpge 32 // Branch if integers greater than or equal to
12 :028 (0x1c) iload_2 // Load integer from local variable 2
13 :043 (0x2b) aload_1 // Load object reference from local variable 1
14 :029 (0x1d) iload_3 // Load integer from local variable 3
15 :182 (0xb6) invokevirtual java.util.Vector get (I)Ljava/lang/Object; (3) // Invoke method
18 :192 (0xc0) checkcast <java/lang/Integer> (4) // Make sure object is of given type
21 :182 (0xb6) invokevirtual java.lang.Integer intValue ()I (5) // Invoke method
24 :096 (0x60) iadd // Integer add
25 :061 (0x3d) istore_2 // Store integer into local variable 2
26 :132 (0x84) iinc <stack> 3 1 // Increment local variable by constant
29 :167 (0xa7) goto 4 // Branch always
32 :028 (0x1c) iload_2 // Load integer from local variable 2
33 :172 (0xac) ireturn // Return integer from function
Attribute(s) =
5 LineNumber(s):
LineNumber( 0, 25 )
LineNumber( 2, 26 )
LineNumber( 12, 27 )
LineNumber( 26, 26 )
LineNumber( 32, 29 )
4 Local(s):
LocalVariable( start_pc = 0, length = 34, index = 1 : java.util.Vector v
LocalVariable( start_pc = 0, length = 34, index = 0 : TestClass this
LocalVariable( start_pc = 2, length = 32, index = 2 : int sum
LocalVariable( start_pc = 4, length = 28, index = 3 : int i
Bytcode dump ends
Mesmo para esse app com dois methodos diferentes e com algo mais funcionalidade do que no meu exemplo os bytecodes são iguais. Verifiquei com jdk1.2.2 & 1.3.0 da sun.
sven
Leonardo Souza Mario Bueno wrote:
000901c0b3a9$954d7420$[EMAIL PROTECTED]">Não posso afirmar com certeza, mas fiz o teste abaixo e a diferença não foi lá
grandes coisas.. pra falar a verdade, usando final foi até mais lento na maioria das
vezes. Tentei inverter a ordem do teste (primeiro sem final ) e o resultado não se
alterou.
Usei a Java HotSpot(TM) Client VM (build 1.3.0_01, mixed mode) para rodar os testes.
Acredito que a otimização varie de acordo com o tipo efabricante da JVM que você
estiver usando.
Eu geralmente uso final somente quando quero usar um argumento de método em uma inner
class anonima... fora isto praticamente nunca uso. Acho que só vale a pena usar se
você desenvolver aplicações matemáticas ou intensivas no uso de CPU.
import java.util.*;
public class FinalTest {
public int fazX(Vector v) {
int sum = 0;
for (int i = 0; i < v.size(); i++) {
sum += ((Integer)v.get(i)).intValue();
}
return sum;
}
public int fazXFinal(final Vector v) {
int sum = 0;
for (int i = 0; i < v.size(); i++) {
sum += ((Integer)v.get(i)).intValue();
}
return sum;
}
public static void main(String args[]) {
Vector data = new Vector(1000000);
for (int i = 0; i < 1000000; i++) {
data.add(new Integer(i));
}
FinalTest test = new FinalTest();
long inicio = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
test.fazXFinal(data);
}
long fim = System.currentTimeMillis();
System.out.println("Tempo usando final: "+ (fim-inicio) +"ms");
System.gc();
inicio = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
test.fazX(data);
}
fim = System.currentTimeMillis();
System.out.println("Tempo sem usar final: "+ (fim-inicio) +"ms");
}
}
.....................................................
Leonardo Souza Mario Bueno
itera Informática
Voice, Wireless & Web Solutions
[EMAIL PROTECTED]
Phone: 55 27 337 0317
Cell: 55 27 9971 1375
Visit our website at:
http://www.itera.com.br
.....................................................
----- Original Message -----
From: "Mister M" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, March 22, 2001 10:34 AM
Subject: final em lista de argumentosOla pessoal,
Alguem saberia me afirmar com certeza se o uso de final na lista de
argumentos melhora a performance? Por exemplo, eu sei que em:
public void fazX() {
final Vector v = new Vector();
...
}
pode vir realmente a permitir otimizacoes do compilador. Mas e:
public void fazX(final Vector v) {
...
}
serah q melhora a performance???
Tks anyway!
[]'s
Michael Nascimento Santos
Analista/Consultor
CPM Sistemas - www.cpm.com.br
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------