Confronto efficienza codice

di il
1 risposte

Confronto efficienza codice

Ciao a tutti, vorrei ottenere un feedback per quanto riguarda l'efficienza nella risoluzione di un problema con uno script php, poichè ho scritto un codice diverso dal mio professore di informatica, il quale non l'ha visto di buon occhio.

CODICE 1

if (isset($_POST["modificato"])) { // Verifica se il modulo è stato inviato con il campo "modificato".
   $descrittore = fopen("palloniOro.txt", "r"); // Apre il file "palloniOro.txt" in modalità lettura.
   
   while (!feof($descrittore)) { // Continua a leggere fino alla fine del file.
       $line = fgets($descrittore); // Legge una riga dal file.
       $contenuto = str_replace("\n", "", $line); // Rimuove il carattere di nuova riga (\n) dalla riga letta.
       
       if (strlen($contenuto) > 2) { // Controlla che la riga non sia vuota o troppo corta.
           $palloni[] = explode(",", $contenuto); // Divide la riga in un array utilizzando la virgola come separatore.
       }
   }
   
   $anno = $_POST["anno"]; // Recupera il valore dell'anno inviato tramite POST.
   $vincitore = $_POST["vincitore"]; // Recupera il nome del vincitore inviato tramite POST.
   $squadra = $_POST["squadra"]; // Recupera il nome della squadra inviato tramite POST.
   $punteggio = $_POST["punteggio"]; // Recupera il punteggio inviato tramite POST.
   
   fclose($descrittore); // Chiude il file aperto in modalità lettura.
   $descrittore = fopen("palloniOro.txt", "w"); // Riapre il file in modalità scrittura per sovrascriverlo.
   
   $nonTrovato = -1; // Inizializza una variabile per verificare se l'anno è stato trovato (-1 significa "non trovato").
   
   for ($i = 0; $i < count($palloni); $i++) { // Itera su ogni riga memorizzata in `$palloni`.
       if ($palloni[$i][0] == $anno) { // Se il primo valore (anno) corrisponde all'anno specificato.
           fwrite($descrittore, $anno . "," . $vincitore . "," . $squadra . "," . $punteggio . "\n"); // Scrive i dati aggiornati nel file.
           $nonTrovato = 1; // Imposta `$nonTrovato` a 1 per indicare che la riga è stata trovata e aggiornata.
       } else { 
           fwrite($descrittore, $palloni[$i][0] . "," . $palloni[$i][1] . "," . $palloni[$i][2] . "," . $palloni[$i][3] . "\n"); // Scrive la riga originale senza modifiche.
       }
   }
   
   fclose($descrittore); // Chiude il file dopo aver scritto tutte le righe.
}

CODICE 2 (MIO)

if (isset($_POST['modifica'])) { // Verifica se il modulo è stato inviato con il campo "modifica".
   $fatto = false; // Variabile per indicare se una modifica è stata effettuata (inizialmente false).
   $backupStream = fopen('backup.txt', 'a'); // Apre (o crea) il file "backup.txt" in modalità append per scrivere i dati aggiornati.
   $mainStream = fopen('palloniOro.txt', 'r'); // Apre il file originale "palloniOro.txt" in modalità lettura.
   while (!feof($mainStream)) { // Continua a leggere fino a raggiungere la fine del file.
       $riga = fgets($mainStream); // Legge una riga dal file.
       if ($riga) { // Controlla che la riga non sia vuota.
           $data = explode(',', $riga); // Divide la riga in un array utilizzando la virgola come separatore.
           if ($data[0] == $_POST['anno']) { // Controlla se l'anno nella riga corrisponde all'anno inviato tramite POST.
               $data[1] = !empty($_POST['nome']) ? $_POST['nome'] : $data[1]; // Aggiorna il nome se fornito, altrimenti mantiene il valore originale.
               $data[2] = !empty($_POST['squadra']) ? $_POST['squadra'] : $data[2]; // Aggiorna la squadra se fornita, altrimenti mantiene il valore originale.
               $data[3] = !empty($_POST['punti']) ? $_POST['punti'] : str_replace("\n","",$data[3]); // Aggiorna il punteggio se fornito, altrimenti mantiene il valore originale.
               $riga = implode(',', $data); // Ricompone la riga aggiornata in una stringa separata da virgole.
               $riga = $riga . "\n"; // Aggiunge il carattere di nuova riga (\n).
               $fatto = true; // Indica che è avvenuta una modifica.
           }
           if (!$fatto) { // Se non è stata effettuata una modifica.
               $riga = implode(',', $data); // Mantiene la riga originale invariata.
           }
           fwrite($backupStream, $riga); // Scrive la riga (modificata o meno) nel file di backup.
       }
   }
   fclose($backupStream); // Chiude il file "backup.txt".
   fclose($mainStream); // Chiude il file originale "palloniOro.txt".
   unlink('palloniOro.txt'); // Elimina il file originale "palloniOro.txt".
   rename('backup.txt', 'palloniOro.txt'); // Rinomina "backup.txt" in "palloniOro.txt", sostituendo il file originale.
}

Come vedete lo script gestisce una richiesta POST da un form per la modifica di una riga in un file di testo. Esso possiede la seguente struttura ripetuta per più righe:

ANNO1,CALCIATORE1,SQUADRA1,PUNTEGGIO1
ANNO2,CALCIATORE2,SQUADRA2,PUNTEGGIO2

Per ogni chiarimento sul problema sono disponibile e grazie.

1 Risposte

  • Re: Confronto efficienza codice

    Ciao!

    Il CODICE 2 è più efficiente del CODICE 1
    I motivi sono i seguenti (includo la notazione big O se hai familiarità con i concetti di time and space complexity): 

    • Il CODICE 1 è più lento perché usa due strutture di loop rispetto a CODICE 2 per scorrere lo stesso set di dati - [ O(2n) contro O(n) ]
    • Il CODICE 1 utilizza più memoria perché carica l'intero dataset in memoria per l'elaborazione mentre CODICE 2 carica in memoria una sola riga per volta. - [ O(n) contro O(1) ]


    Detto questo, il mio consiglio quando il tuo professore “non vede di buon occhio” il tuo approccio al problema è di chiedere sempre informazioni su cosa non lo ha convinto. Possono essere tanti i motivi ed è compito di un educatore aiutarti a capire meglio l'argomento se secondo lui non hai afferrato qualche concetto. 

Devi accedere o registrarti per scrivere nel forum
1 risposte