Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [php] più veloce if o switch?

    sembrerà una domanda demenziale, ma qual'è il più veloce tra i due per una pagina eseguita centinaia di volte al minuto?

    come lavora php su una if?
    legge il contenuto dell'intera porzione anche se la condizione non è vera?
    e con switch?
    Una forte determinazione ad esser felici vi aiuterà

  2. #2
    Prima di metterti ad "ottimizzare" due costrutti hai provveduto ad ottimizzare tutto il resto?

    Se accedi ad un database, hai implementato un sistema di caching? Hai provato le connessioni persistenti?
    Se generi dell'output, hai implementato un sistema di caching?
    Hai rivisto gli algoritmi che utilizzi? C'è modo di migliorarne le performace?
    E' realmente necessario eseguire la pagina centinaia di volte al minuto?

    etc. etc.

  3. #3
    mysql_pconnect -> yes
    ---------------------------------------------------------------
    sistema di caching delle query ? boh!
    cmq ogni pagina è 2 query molto leggere
    ---------------------------------------------------------------
    output unico,
    un solo echo finale di variabili fatte con ' '
    ---------------------------------------------------------------
    il numero di volte purtroppo è dato dall'alto numero di utenti
    Una forte determinazione ad esser felici vi aiuterà

  4. #4
    Non ci sono solo "if" o "switch".. ad esempio considera anche le seguenti possibilità:
    Codice PHP:
    <?php
    function Action1 (){
        return 
    "Action1";
    }

    function 
    Action2 (){
        return 
    "Action2";
    }

    function 
    Action3 (){
        return 
    "Action3";
    }

    function 
    TestActionArray ($theActionNumber){
        
    $aActionArray = array (
            
    "Action1",
            
    "Action2",
            
    "Action3",
        );
        
        return 
    $aActionArray [$theActionNumber 1] ();
    }

    function 
    TestActionName ($theActionNumber){
        
    $aAction "Action".$theActionNumber;
        return 
    $aAction ();
        
    }

    function 
    TestAction (){
        echo 
    TestActionArray (1);
        echo 
    TestActionName (2);
    }

    TestAction ();
    ?>

  5. #5
    Originariamente inviato da MacApp
    Non ci sono solo "if" o "switch"..
    Certo, sopratutto quando si tratta di ottimizzare le performace:

    Codice PHP:
    <pre>
    <?php
    function Action1 (){
        echo 
    "Action1";
    }

    function 
    Action2 (){
        echo 
    "Action2";
    }

    function 
    Action3 (){
        echo 
    "Action3";
    }

    function 
    TestActionArray ($theActionNumber){
        
    $aActionArray = array (
            
    "Action1",
            
    "Action2",
            
    "Action3",
        );
        
        return 
    $aActionArray [$theActionNumber 1] ($theActionNumber);
    }

    function 
    TestActionName ($theActionNumber){
        
    $aAction "Action".$theActionNumber;
        return 
    $aAction ($theActionNumber);
        


    define('COUNT'100000);

    ob_start();
    $start microtime();
    $theActionNumber 1;
    for (
    $i 0$i COUNT$i++) {
        
    TestActionName($theActionNumber);
    }
    $time microtime() - $start;
    ob_end_clean();
    echo 
    "Did nothing in $time seconds\n";


    ob_start();
    $start microtime();
    $theActionNumber 1;
    for (
    $i 0$i COUNT$i++) {
        if (
    $theActionNumber == 1) {
            echo 
    "Action1";
        }
    }
    $time microtime() - $start;
    ob_end_clean();

    echo 
    "Did nothing in $time seconds\n";

    ?>
    </pre>
    Il tuo codice risulta circa 7 volte più lento di richiamare direttamente l'IF.

  6. #6
    Originariamente inviato da filippo.toso
    Il tuo codice risulta circa 7 volte più lento di richiamare direttamente l'IF.
    I test non sono equivalenti, infatti laddove tu chiami esplicitamente in linea:
    Codice PHP:
    for ($i 0$i COUNT$i++) { 
        if (
    $theActionNumber == 1) { 
            echo 
    "Action1"
        } 

    dovresti chiamare, per rendere equivalente il test un qualcosa del genere:
    Codice PHP:
    function TestActionIf ($theActionNumber){
        if (
    $theActionNumber == 1){
            
    Action1 ();
        }
        else{
            if (
    $theActionNumber == 2){
                
    Action2 ();
            }
            else{
                if (
    $theActionNumber == 3){
                    
    Action3 ();
                }
            }
        }
    }
    for (
    $i 0$i COUNT$i++) { 
        
    TestActionIf ($theActionNumber);

    ad esempio, cosi' facendo per COUNT = 10000000 con $theActionNumber = 3, ottengo:

    codice:
    $ time php -f action_TestActionIf.php 
    Test done
    real    0m12.119s
    
    $ time php -f action_TestActionName.php 
    Test done
    real    0m14.846s

  7. #7
    Originariamente inviato da MacApp
    I test non sono equivalenti
    Affermando Non ci sono solo "if" o "switch" dichiari che il codice che hai postato è un'alternativa valida ad if e switch.

    Ovvero sostituendo la chiamata TestActionName(1) ad un if($action == 1) si dovrebbero ottenere delle performance migliori.

    Una chiamata a funzione (in verità nel caso riportato "a più funzioni"), introduce un sensibile overhead totalmente ingiustificato se il solo obiettivo era NON usare il costrutto IF().

  8. #8
    Originariamente inviato da MacApp
    I test non sono equivalenti, infatti laddove tu chiami esplicitamente in linea:
    Codice PHP:
    for ($i 0$i COUNT$i++) { 
        if (
    $theActionNumber == 1) { 
            echo 
    "Action1"
        } 

    dovresti chiamare, per rendere equivalente il test un qualcosa del genere:
    Codice PHP:
    function TestActionIf ($theActionNumber){
        if (
    $theActionNumber == 1){
            
    Action1 ();
        }
        else{
            if (
    $theActionNumber == 2){
                
    Action2 ();
            }
            else{
                if (
    $theActionNumber == 3){
                    
    Action3 ();
                }
            }
        }
    }
    for (
    $i 0$i COUNT$i++) { 
        
    TestActionIf ($theActionNumber);

    ad esempio, cosi' facendo per COUNT = 10000000 con $theActionNumber = 3, ottengo:

    codice:
    $ time php -f action_TestActionIf.php 
    Test done
    real    0m12.119s
    
    $ time php -f action_TestActionName.php 
    Test done
    real    0m14.846s
    
    $ time php -f action_TestActionArray.php 
    Test done
    real    0m14.092s
    EDIT: aggiunto il risultato per TestActionArray

  9. #9
    Originariamente inviato da filippo.toso
    Affermando Non ci sono solo "if" o "switch" dichiari che il codice che hai postato è un'alternativa valida ad if e switch.
    A dire il vero ho scritto scritto di "considerare anche".

  10. #10
    Originariamente inviato da MacApp
    A dire il vero ho scritto scritto di "considerare anche".
    In un thread intitolato "più veloce if o switch?", posti un messaggio che inizia con "Non ci sono solo "if" o "switch".. " e poi suggerisci di considerare anche le seguenti possibilità.

    Chissà cosa mi ha fatto credere che ritenessi il tuo esempio più performante dei costrutti if() e switch()...

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.