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] 
-------------------------------------------------------------------------

Reply via email to