Visualizzazione risultati 1 fino 5 di 5

Discussione: Ottimizzazione del codice PHP

  1. #1
    Guest

    Predefinito Ottimizzazione del codice PHP

    Non so, magari potrebbe diventare un topic utile a chi ha un problema e vorrebbe ottimizzare una parte di uno script.

    A me, per esempio, non piace avere parti uguali, cioè che fanno due cose praticamente uguali e cerco di averne solo una con tutte le opzioni.

    Per esempio, io ho questa parte di codice:
    Codice PHP:
    <?php
    $var
    = (strpos($var, '{L_') !== false) ?
    preg_replace('#\{L_([A-Z0-9_]+)\}#', "<?php echo (isset(\$user->lang['$1'])) ? \$user->lang['$1'] : '{ L_$1 }'; ?>", $var) :
    preg_replace('#\{([A-Z0-9_]+)\}#', "<?php echo (isset(\$this->_var['$1']) && !empty(\$this->_var['$1'])) ? \$this->_var['$1'] : '{ $1 }'; ?>", $var);
    ?>
    Come potete vedere la differenza è ben poca e vorrei fare tutto in un'unica stringa, quindi ho fatto una cosa simile:
    Codice PHP:
    <?php
    $is_lang
    = (strpos($var, '{L_') !== false) ? 'L_' : '';
    $_var = $is_lang ? 'user->lang' : 'this->_var';
    $var = preg_replace("#\{{$is_lang}([A-Z0-9_]+)\}#", "<?php echo (isset(\${$_var}['$1']) && !empty(\${$_var}['$1'])) ? \${$_var}['$1'] : '{ {$is_lang}$1 }'; ?>", $var);
    ?>
    Ma ho notato che aumenta leggermente la memoria utilizzata dallo script (1kb~), sicuramente perché valorizzo due variabili, ed usando la funazione unset() per liberarla ne occuperei di più utilizzandola.

    Voi cosa ne pensate? Come fareste? E' giusto avere questa "fissazione" di "semplificare" il codice?

    Ultima modifica di biccheddu : 05-01-2011 alle ore 00.19.54

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    Voi cosa ne pensate? Come fareste? E' giusto avere questa "fissazione" di "semplificare" il codice?
    Partendo dal presupposto che PHP non è il linguaggio più efficiente che esista è a mio avviso inutile ottimizzare più del dovuto per recuperare quale byte di memoria o qualche ciclo di clock del processore.
    Credo che sia più utile scrivere del codice comprensibile e facilmente modificabile e/o riutilizzabile.


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  3. #3
    Guest

    Predefinito

    @biccheddu non confondereperò memoria usata dallo script durante il funzionamento e dimensione del file di script, sono due cose ben separate e differenti, uno script da un kilobyte può arrivare ad usare un mega di spazio se dentro c'è una variabile a cui viene passato appunto un mega di qualche cosa :D
    Usare unset oppure mettere a null una variabile è ottima pratica comunque perché in ogni caso si va a liberare della memoria non più usata.
    Tieni in considerazione che ogni installazione LAMP (o WAMP) di default utilizza 8 mega di ram per ogni script in esecuzione sul server... più tutto il resto (LAMP, Sistema operativo eccetera) se ci sono 100 siti attivi sul server e tutti usano una pagina php nello stesso momento solo per il PHP vengono allocati 800Megabyte.
    Ovviamente gli 8 mega allocati per script sono comprensivi anche della specifica sezione dati, quindi se usi uno script di un kilobyte che carica un mega di roba, comunque hai ancora disposizione 7 mega da allocare, ovvio che non per questo vanno sprecati.
    Ad ogni buon conto se proprio vuoi ottimizzare quello script prova a vedere se puoi evitare le funzioni preg_ che usano un casino immenso di cicli di clock per funzionare.

    PS buona lettura http://www.php.net/manual/en/internals2.php

  4. #4
    Guest

    Predefinito

    Io all'inizio di ogni script utilizzo la funzione memory_get_usage() che restituisce la memoria utilizzata da php (o sbaglio?) ed alla fine faccio una sottrazione, sempre con memory_get_usage(), per sapere quanta memoria occupa IL MIO script. Non so se mi sbaglio, ma credo sia corretto così, no? Non intendo la dimensioni fisica del file anche perché 1kb~ sarebbero 1000~ caratteri, no?

    Sono molto fissato con l'ottimizzazione, ovviamente in base alle mie conoscenze (ed aggiungo che non si finisce mai d'imparare), per poter scrivere applicazioni veloci e che non appesantiscano inutilmente il server.

    Ora, leggendo le tue parole:
    Citazione Originalmente inviato da dogato Visualizza messaggio
    [...] Ad ogni buon conto se proprio vuoi ottimizzare quello script prova a vedere se puoi evitare le funzioni preg_ che usano un casino immenso di cicli di clock per funzionare.
    Rispondo che non mi è possibile per un fattore di dinamicità, alla fine la differenza d'utilizzo di preg_* ed str_replace/strtr.

    Per esempio, ho una funzione che utilizza preg_replace per l'eliminazione di alcuni caratteri e, come hai detto tu, sapevo che le preg_* rallentano l'esecuzione ed "appesantiscono" il server, quindi ho provato con str_replace e ho notato che, con tutto lo script in esecuzione ovviamente, vengono occupati:
    Codice PHP:
    <?php
    preg_replace
    ('#[`\^~\'"]#', '', $stringa); # 271.14 Kb
    str_replace(array('`', '^', '~', '\'', '"'), '', $stringa); # 271.65 Kb
    ?>
    In base alle guide, dovrei evitare preg_*, ma in questo caso nonostante utilizzi meno memoria la preg_ dovrei usare str_replace? La differenza in tempo è minima, si tratta di millesimi di secondi quindi la differenza non è così grande.

    Grazie per tutte le informazioni e le risposte

  5. #5
    Guest

    Predefinito

    Il fatto non è tanto la memoria che viene occupata ma i cicli di clock.
    Considera che comunque la memoria non è mai un vero problema a meno di non spingere la macchina davvero al limite, ma questo non è un tuo problema, almeno non lo sarà fino a quando non deciderai di fare l'amministratore di sistema. :)
    Io non conosco la configurazione delle macchine di altervista ma immagino sia abbastanza ottimizzata per il carico di lavoro che debbono sopportare visto anche ciò che ci deve girar su (senza polemica).
    Ad ogni buon conto i cosidetti colli di bottiglia non dipendono solo dalla memoria usata ma soprattutto dai cicli di clock che una cpu deve usare per risolvere la funzione.
    preg_ ha il brutto vizio di prenderne parecchi però in ogni caso tutto dipende dalla macchina su cui gira lo script.
    Diciamola tutta, se è il Web che ti interessa tieni in considerazione che un sito internet nella migliore delle ipotesi è una cosa che si guarda con molta calma, ovvero le persone lo "sfogliano" alla velocità concessa loro da: la potenza del server, la potenza del loro pc, la potenza della rete (larghezza della banda), la potenza della loro connessione.
    Alla fine contare i cicli di clock o la ram usata è il meno, certo evitare di fare due volte la stessa cosa quando ad esempio si può ottimizzare il tutto con una funzione esterna potrebbe essere una soluzione elegante e pratica, ma davvero è nulla rispetto a tutti i colli di bottiglia che ci sono nella rete delle reti.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •