Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31

    Come migliorare la velocità del codice

    Ragazzi ultimamente ho partecipato ad una "Gara di Programmazione" creata dal mio professore di programmazione Java. Questa gara(con frequenza settimanale...cioè ogni venerdì riparte per concludersi domenica!) prevede la risoluzione di un progetto che viene assegnato al "candidato". Il progetto non dovrà solo fornire un output corretto ma anche un tempo di risoluzione molto basso in quanto viene stilata una classifica generale dei progetti con i rispettivi tempi d'esecuzione. I 3 progetti con i tempi più bassi potrebbero avere un'agevolazione all'esame scritto(in pratica si possono concentrare solo sull'esame orale!). Il progetto di questa settimana lo potete trovare al seguente LINK insieme al file di input fornito dal professore mentre la mia risoluzione è la seguente:
    codice:
     
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.BufferedWriter;
    import java.text.DecimalFormat;
    import java.text.DecimalFormatSymbols;
    import java.util.Locale;
    
    
    public class asterix {
    	private static int b,h; //Dimensioni di ogni strato della piramide 
    	private static double peso;
    	
    	public static int getBase()
    	{
    		return b;
    	}
    	public static int getAltezza()
    	{
    		return h;
    	}
    	public static double getPeso()
    	{
    		return peso;
    	}
    	public static void setBase(int bb)
    	{
    		b=bb;
    	}
    	public static void setAltezza(int hh)
    	{
    		h=hh;
    	}
    	public static void setPeso(double peso1)
    	{
    		peso=peso1;
    	}
    	
    	
    	
    
    	public static String calcola(int h,int k,double ps)
    	{
    		int area=0,lung=0,alt=0;
    		double pstot=0;
    		//Importante: l'altezza della piramide la stabilisce il valore più piccolo tra h e k. Es. h=6 k=4 l'altezza della piramide sara' 4 
    		if(k >= h) 
    		{
    			lung = k;
    			alt = h;
    			area=(((h*(h+1)*((2*h)+1))/6))+((k-h)*((h*(h+1))/2));//Formula per calcolare il numero totale di mattoni
    		}
    		else 
    		{
    			lung = h;
    			alt = k;
    			area=(((k*(k+1)*((2*k)+1))/6))+((h-k)*((k*(k+1))/2));//Formula per calcolare il numero totale di mattoni
    		}
    		for(int i = alt; i > 0; i--) 
    			pstot += (lung--*alt)*(ps+(alt---1));
    		DecimalFormat df = new DecimalFormat("0.00", new DecimalFormatSymbols(Locale.ITALIAN)); //Mi serve per impostare il numero di cifre dopo la virgola a 2
    		return area + " " +df.format(pstot)+"Kg";
    		
    	}
    	public _static void LeggiFile(String nome) throws IOException
    	{
    		FileReader input = null;
    		FileWriter output = null;
    		BufferedReader in = null;
    		BufferedWriter out= null;
    		try
    		{
    			input=new FileReader("input.txt");
    			in=new BufferedReader(input);
    			output=new FileWriter("output.txt");
    			out=new BufferedWriter(output);
    			String str="";
    			
    		while((str=in.readLine())!=null)//Fino a quando non arrivo a fine file
    			{
    				out.write(doit(str));
    				out.newLine();
    			}
    		}
    		finally
    		{
    			in.close();
    			input.close();
    			out.close();
    			output.close();
    			
    			System.out.println("*** _ DONE _ ***");
    		}
    		
    	}
    	public static String doit(String s) 
    	{
    	 _ _ _String [] temp = s.replaceAll("kg", "").split(" ");
     _ _ _ _ _ _ _//Dalla stringa sostituisco la parola "kg" con un carattere di spazio e poi elimino tutti gli spazi inserendo i 3 numeri in un array di 3 posizioni 
    	 _ _ _return dump(temp);
    	}
    	 public static String dump(String []s) 
    	 {
     _ _ _ _ _ _//Converto i valori di ogni posizione in numeri interi e in double perche' i primi due valori sono le dimensioni e il terzo e' il peso di ogni mattone che sta' sulla sommita' della piramide
    		 setBase(Integer.parseInt(s[0]));
    		 setAltezza(Integer.parseInt(s[1]));
    		 setPeso(Double.parseDouble(s[2]));
    		 
    		 return calcola(getBase(),getAltezza(),getPeso());
    	 }
    	 public static void main(String arg[])throws IOException
    	 {
    		 LeggiFile("input.txt");
    	 }
    }
    La mia domanda è: "per quanto il mio output sia corretto il codice è risultato abbastanza lento(la media dei tempi d'esecuzione del mio file ha dato come risultato: 984.00millisecondi) .....in cosa potrei migliorare questo codice?Dove secondo voi perde tempo?Aspetto vostre notizie . Grazie a tutti.

  2. #2
    puoi utilizzare thread?
    -----
    101110101011101111100000
    -----

  3. #3
    Ciao soeca,
    Ma su quante esecuzione consecutive ti viene quella media ?
    Ho provato e sulla mia macchina (e questo cmq incide) ci mette al più 490 millisencondi su 100 iterazioni.

  4. #4
    Originariamente inviato da francesco.muia
    Ciao soeca,
    Ma su quante esecuzione consecutive ti viene quella media ?
    Ho provato e sulla mia macchina (e questo cmq incide) ci mette al più 490 millisencondi su 100 iterazioni.
    e nn incide solo la potenza dell'hardware, ma anche dal sistema usato.
    provate su windows xp a 32 bit e una linux a 64 bit e vedrete la differenza....

  5. #5
    Originariamente inviato da fermat
    e nn incide solo la potenza dell'hardware, ma anche dal sistema usato.
    provate su windows xp a 32 bit e una linux a 64 bit e vedrete la differenza....
    Ti quoto in pieno, infatti ho provato su xp a 32 e a 64 e i tempi sono totalmente diversi

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31
    Allora nel sito del prof c'è scritto:
    codice:
    VALUTAZIONE
    I file java consegnati alla fine dell'esercizio verranno valutati da un sistema automatico che ne calcolerà le prestazioni e ne verificherà la correttezza. La macchina utilizzata per il calcolo delle prestazioni possiede un Processore Intel Core 2 Duo da 1.66GHz, una memoria da 1 GB e sistema operativo Linux Ubuntu 32bit.
    Le prestazioni di ogni singola soluzione sono calcolati come media di 100 esecuzioni in modo da ridurre eventuali variazioni dovute al sistema.
    Il grado di correttezza della soluzione fornita è valutato confrontando il file di output restituito dal programma e l'output corretto al problema.
    Verranno presi in considerazione solo le soluzioni il cui output non differisce per più del 80% dall'output corretto.

  7. #7
    si ok, è ovvio che il prof valuterà sempre usando un solo pc.
    ma magari tu hai un pc lento ed è per questo che il valore è "alto".
    cioè, magari se provi quel codice sul pc d'esame va una scheggia.....

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31
    No no...il risultato che ho postato è quello che esce dal pc del prof e se voglio evitare di farmi l'esame scritto devo intanto basarmi sulla configurazione hardware sua e di conseguenza abbassare drasticamente i tempi!!Però non capisco da dove partire!!
    PS. i thread ancora non li abbiamo trattati(siamo all'inizio del corso!!) quindi praticamente non posso usarli visto che c'è scritto che argomenti diversi da quelli trattati a lezione non possono essere usati per risolvere l'esercizio!Dovrei migliorare sia la complessità(perchè per ora sono a O(n) ) sia questi benedetti tempi!!Ma cosa evitare??O meglio in cosa posso migliorare questo codice......se volete vi posto il codice del ragazzo che è arrivato primo(io ho capito ben poco di quello che ha fatto però il suo codice funziona con un tempo pari a 200millisecondi tondi tondi!!)

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,477

    Moderazione

    Originariamente inviato da soeca
    No no...il risultato che ho postato è quello che esce dal pc del prof e se voglio evitare di farmi l'esame scritto devo intanto basarmi sulla configurazione hardware sua e di conseguenza abbassare drasticamente i tempi!!Però non capisco da dove partire!!
    PS. i thread ancora non li abbiamo trattati(siamo all'inizio del corso!!) quindi praticamente non posso usarli visto che c'è scritto che argomenti diversi da quelli trattati a lezione non possono essere usati per risolvere l'esercizio!Dovrei migliorare sia la complessità(perchè per ora sono a O(n) ) sia questi benedetti tempi!!Ma cosa evitare??O meglio in cosa posso migliorare questo codice......se volete vi posto il codice del ragazzo che è arrivato primo(io ho capito ben poco di quello che ha fatto però il suo codice funziona con un tempo pari a 200millisecondi tondi tondi!!)
    In via precauzionale, ti chiedo se ti sei accertato dell'assenza di possibili risvolti legati al fatto che stai chiedendo aiuto qui pubblicamente per la gara, e se hai il consenso dell'interessato (il primo classificato) nel pubblicare il suo codice sorgente.

    Questo perché, una volta affrontata, la discussione non può essere chiusa o rimossa deliberatamente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31
    Non ho chiesto a nessuno se posso pubblicare il suo codice però non penso sia un problema visto che i file di tutti i partecipanti sono pubblici!!Per il resto la gara di programmazione si apre ogni venerdì e si chiude la domenica!Questo vuol dire che prima di Venerdì non possiamo sapere su cosa verterà il progetto da fare e questo implica che, non essendo oggi Venerdi,Sabato o Domenica, questo file risale ad una gara già conclusa e precisamente all'ultima gara cominciata Venerdì 8Aprile e conclusa Domenica 10Aprile. Non sto' chiedendo di aiutarmi a fare l'esercizio (o ancora peggio di farmi l'esercizio) di una gara che è in corso. Sto' chiedendo di aiutarmi a capire cosa posso migliorare e che tecniche potrei usare nelle prossime gare per accorciare ulteriormente i tempi portandovi come esempio una gara dove i risultati già sono usciti e, ovviamente, non possono cambiare!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.