Newsgroup: it.comp.java
Titolo: [DIFFICILE ed INUTILE con SOURCE breve]La mia class è più veloce con un if in più!

Stavo cercando di valutare quanto costi in termini di tempo un if su una
variabile booleana ed ho avuto una sorpresa...
(P II 350 MHz 128Mb ram win98se jdk1.3.1)
[SOURCE]
1  public class Delay extends Thread{
2 public boolean test=true;
3
4 public static void main(String[] args){
5  Delay me=new Delay();
6  me.exec();
7 }
8
9 public void exec(){
10  Thread ctrl=new Thread(this);
11  ctrl.setDaemon(true);
12  ctrl.start();
13  long start=System.currentTimeMillis();
14  for(int i=0;i<100000000;i++){
15   if(!test)break; //questa è la linea di cui voglio sapere il tempo di
esecuzione
16  }
17  System.out.println(System.currentTimeMillis()-start);
18 }
19
20 public void run(){
21  java.io.InputStreamReader console=new
java.io.InputStreamReader(System.in);
22  try{
23   console.read();
24  }catch(java.io.IOException e){
25   e.printStackTrace();
26  }finally{
27   test=false;
28   System.out.println("interrupted by console");
29  }
30 }
31 }
[/SOURCE]
Se compilo (previa rimozione dei numeri di linea :-}) ed eseguo il sorgente
qui sopra mi stampa un tempo di esecuzione di 1740~1830 msec.
Se *elimino* if(!test)break; alla linea 15 esegue in 2030~2080 msec.
Cosa mi sfugge? (riprovato almeno 200 volte per entrambe le versioni, tempi
stabili)

ma scusa.. quanti cicli fa?
mi sembra di capire che l'interuzzione la forzi tu con la console (anke se
nn ho ben capito l'uso di quel thread.. ma mi sembra interessante..)
nel 1o caso quando premi invio, (se ripeto ho capito) blocchi tramite
quel'if il ciclo (fai un break)
se lo togli... quel ciclo va fatto tutto.... sei sicuro che nel caso con
l'if il ciclo è fatto completo?
ciao.

 ha scritto nel messaggio
news:fYVg7.2369$i81.1...@news.infostrada.it...


 l'if il ciclo č fatto completo?
Sono sicuro, sia con che senza l'if il ciclo viene ripetuto cento milioni di
volte. Con l'if *posso* interrompere il ciclo, senza l'if non posso. Ma se
non interrompo il ciclo, rimane ugualmente piů veloce la versione *con*
l'if. La mia meraviglia č tutta qui, credevo risultasse piů lento un ciclo
con un if in piů...

 Non ho capito cosč che ti meraviglia..
Mi meraviglia che la versione *con* l'if sia 2 o 300 msec piů *veloce* di
quella senza;


Prova a decompilare il bytecode e vedi un po' se e come č stato
ottimizzato; potrebbe essere un buon punto di partenza.
Ciao,
	Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 ottimizzato; potrebbe essere un buon punto di partenza.
Consigliami un decompilatore, se puoi.
Grazie,
Maurizio.

variabile booleana ed ho avuto una sorpresa...
Hotspot. :-) (prova con -Xint)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 Consigliami un decompilatore, se puoi.
JAD - the fast java decompiler fnziona bene pare. Fai una rapida ricerca
su google perché l'URL preciso non me lo ricordo.


 su google perché l'URL preciso non me lo ricordo.
Già trovato decafe, grazie comunque. Ad ogni modo le class decompilate sono
esattamente identiche ai sorgenti originali.
Se però eseguo le class con l'opzione -Xint (interpreted mode only), a parte
il rallentamentop dell'ordine di 50 volte, si ristabiliscono le proporzioni
tra la versione con l'if e quella senza.
Boh...
Ancora grazie e ciao,
Maurizio.

 
e se disabiliti il jit? e se provi con un'altra jvm?  :?
evidentemente con quell'if il codice puo` venir meglio ottimizzato
(sembra strano, ma e` possibile).
Ad esempio, modificando leggermente il tuo codice cosi` che esegua tutte
e due i cicli for in sequenza (prima senza l'if, poi con l'if, facendo
tutt'e due le volte Integer.MAX_VALUE iterazioni):
// A
  long start = System.currentTimeMillis();
  for(int i=0; i<Integer.MAX_VALUE; i++){
  }
  System.out.println(System.currentTimeMillis()-start);
// B
  long start2 = System.currentTimeMillis();
  for(int j=0; j<Integer.MAX_VALUE; j++) {
        if(!test)break;
  }
  System.out.println(System.currentTimeMillis()-start2);
mi da come risultato provando al volo sul mio PC:
  3921
  3894
(questo darebbe ragione a te...).
Ma invertendo la sequenza dei cicli for A e B, il risultato e`:
  4588
  0
che come vedi e` ben diverso!!
-- 
Ciao,  |     Gott weiss ich will kein Engel sein
Matteo |                     -- Rammstein, Engel