View Full Version : [JAVA]Tempo esecuzione codice
Come posso sapere quanto ci mette in termini di tempo ad eseguire due pezzi di codice diverso?
In particolare vorrei sapere se fa prima a fare:
if(buffer.getRGB(x,y)==buffer.getRGB(0,0))
dove buffer č un bufferedImage di elevate dimensioni
o fa prima a fare:
if(matr[x][y])
dove matr č una matrice di boolean.
Qual'č il pių veloce nell'esecuzione?
pumppkin
11-07-2006, 18:58
puoi provare ad utilizzare questo codice (sinceramente l'ho usato solo una volta ma su una procedura intera...non so se esistono dei comandi fatti apposta per questo):
Calendar date1 = Calendar.getInstance();
if(buffer.getRGB(x,y)==buffer.getRGB(0,0))
Calendar date2 = Calendar.getInstance();
e poi dovresti farti stampare la differenza di tempo tra le due date
(float)(date2.getTime().getTime()-date1.getTime().getTime())/1000)
forse nel tuo caso anzichč 1000 dovresti usare 10000 o 100000...
puoi fare la stessa cosa con if(matr[x][y])
...ciao...
...potresti provare con...
float inizio = System.getCurrentMills();
...tuo codice...
float fine = System.getCurrentMills()-inizio;
...č codice scritto al volo...non sono certo della sintassi...
...ciao...
sottovento
12-07-2006, 04:24
Mmmm mi da sempre 0.0...
Certo, la divisione (meglio, il cast) e' messo nella posizione sbagliata.
Ad ogni modo, ti consiglio di non dividere: otterrai il risultato in millisecondi, che e' una ragionevole misura per quello che vuoi fare.
Altro consiglio: il tempo di una singola operazione come quella in esame, e' difficile da prendere, visto che verra' eseguita in un tempo molto piccolo.
Fortunatamente, l'operazione che vuoi misurare puo' essere ripetuta (ovviamente non sempre sei in questa condizione).
Se metti in un ciclo
Calendar start_time = Calendar.getInstance();
for (int i = 0; i < 1000000; i++)
operazione_sotto_osservazione();
Calendar end_time = Calendar.getInstance();
ecco che i microsecondi diventano secondi, e le differenze temporali fra le due operazioni si moltiplicano.
High Flying
Sottovento
Ho fatto come mi hai detto!
Grazie funziona benissimo cosė, non pensavo ci fosse cosė tanta differenza e invece...incredibile...
Con questo codice mi stampa un valore di circa -3600 (perchč negativo poi?):
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class Tempo {
public static void main(String[] args) {
PixMap buffer=new PixMap("./s0.png");
boolean[][] matr=buffer.matricePixel();
BufferedImage bf=buffer.bufferImm();
System.out.println("START...");
for(int j=0;j<10;j++){
Calendar start_time = Calendar.getInstance();
for (int i=0;i<10000000;i++){
boolean b=bf.getRGB(20,20)==bf.getRGB(0,0);
}
Calendar end_time = Calendar.getInstance();
System.out.println("Ciclo n"+j+"="+(start_time.getTime().getTime()-end_time.getTime().getTime()));
}
}
}
Mentre con questo solo -45!!! E' decisamente pių veloce!
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class Tempo {
public static void main(String[] args) {
PixMap buffer=new PixMap("./s0.png");
boolean[][] matr=buffer.matricePixel();
BufferedImage bf=buffer.bufferImm();
System.out.println("START...");
for(int j=0;j<10;j++){
Calendar start_time = Calendar.getInstance();
for (int i=0;i<10000000;i++){
boolean b=matr[20][20];
}
Calendar end_time = Calendar.getInstance();
System.out.println("Ciclo n"+j+"="+(start_time.getTime().getTime()-end_time.getTime().getTime()));
}
}
}
sottovento
12-07-2006, 13:14
Ho fatto come mi hai detto!
...
Con questo codice mi stampa un valore di circa -3600 (perchč negativo poi?):
...
Hai fatto start - end, per cui e' negativo. Poco male, tanto si capisce benissimo
High Flying
Sottovento
si puo fare una cosa del genere in C/C++ ?
sottovento
13-07-2006, 06:05
si puo fare una cosa del genere in C/C++ ?
Certamente.
Se hai la possibilita' di eseguire delle ripetizioni del comando, come in questo caso, puoi usare la time() (ti restituisce il numero di secondi trascorsi dal 1/1/1970).
In alternativa, molte implementazioni su diversi sistemi operativi ti danno a disposizione dei metodi piu' precisi, che possono arrivare fino ai nanosecondi.
Usando la time:
time_t start = time(NULL);
<Operazioni di cui vuoi verificare il tempo>
time_t stop = time(NULL);
tempo_trascorso = stop - start;
High Flying
Sottovento
grazie.
ma se l'operazione da verificare venisse eseguita in meno di un secondo come posso fare per avere il risultato in millisecondi?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.