Em relação de QuickSort, mandei uma modificação do metodo swap ontem:
private void swap(int a[], int i, int j){
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
em vez de:
private void swap(int a[], int i, int j){
int T = a[i];
a[i] = a[j];
a[j] = T;
}
O primeiro exemplo em C/C++ é muito mais rapido que o segundo (em
assembler são 6 a 8 operações a menos). Ai fez um teste em Java e o
resultado é exatamente o oposto, quase o dobro de linhas em byecode.
Veja abaixo: (swaptemp utiliza a variavel temporaria T)
private void swaptemp(int a[], int i, int j)
{
// 0 0:aload_1
// 1 1:iload_2
// 2 2:iaload
// 3 3:istore 4
// 4 5:aload_1
// 5 6:iload_2
// 6 7:aload_1
// 7 8:iload_3
// 8 9:iaload
// 9 10:iastore
// 10 11:aload_1
// 11 12:iload_3
// 12 13:iload 4
// 13 15:iastore
// 14 16:return
}
private void swap(int a[], int i, int j)
{
// 0 0:aload_1
// 1 1:iload_2
// 2 2:dup2
// 3 3:iaload
// 4 4:aload_1
// 5 5:iload_3
// 6 6:iaload
// 7 7:ixor
// 8 8:iastore
// 9 9:aload_1
// 10 10:iload_3
// 11 11:dup2
// 12 12:iaload
// 13 13:aload_1
// 14 14:iload_2
// 15 15:iaload
// 16 16:ixor
// 17 17:iastore
// 18 18:aload_1
// 19 19:iload_2
// 20 20:dup2
// 21 21:iaload
// 22 22:aload_1
// 23 23:iload_3
// 24 24:iaload
// 25 25:ixor
// 26 26:iastore
// 27 27:return
}
}
com este resultado na mão fize um terceiro teste:
private void swap2(int a[], int i, int j){
a[i] = a[i] ^ a[j];
a[j] = a[j] ^ a[i];
a[i] = a[i] ^ a[j];
}
Isso é igual a :
private void swap(int a[], int i, int j){
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
e porém deveria gerar os mesmos bytecodes, mas o resultado é pior ainda:
private void swap2(int a[], int i, int j)
{
// 0 0:aload_1
// 1 1:iload_2
// 2 2:aload_1
// 3 3:iload_2
// 4 4:iaload
// 5 5:aload_1
// 6 6:iload_3
// 7 7:iaload
// 8 8:ixor
// 9 9:iastore
// 10 10:aload_1
// 11 11:iload_3
// 12 12:aload_1
// 13 13:iload_3
// 14 14:iaload
// 15 15:aload_1
// 16 16:iload_2
// 17 17:iaload
// 18 18:ixor
// 19 19:iastore
// 20 20:aload_1
// 21 21:iload_2
// 22 22:aload_1
// 23 23:iload_2
// 24 24:iaload
// 25 25:aload_1
// 26 26:iload_3
// 27 27:iaload
// 28 28:ixor
// 29 29:iastore
// 30 30:return
}
Será que java não pode fazer otimalizações ??
sven
------------------------------ 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]
-------------------------------------------------------------------------