Con el permiso de @tognaco aprovecho este tema para realizar una consulta:
 
Yo siempre he utilizado una función sin espresiones regulares para comprobar emails por optimización de tiempos. 
Despues de ver este tema he realizado una comparativa entre funciones y el resultado me ha descolocado... ganan las espresiones regulares en tiempo. 
Algún experto me podría verificar si he realizado la comparativa correctamente? 
El resultado no es muy significativo pero hay está.  
 Código PHP:
        $email = '[email protected]';
    function comprobar_email1($email){
        if (preg_match('/^([a-zA-Z0-9\._]+)\@([a-zA-Z0-9\.-]+)\.([a-zA-Z]{2,4})/',$email)){
            echo 'valid';    
        }
        else{
            echo 'no valid';
        }
    }
    function comprobar_email2($email){
        $mail_correcto = 0;
        //compruebo unas cosas primeras
        if ((strlen($email) >= 6) && (substr_count($email,"@") == 1) && (substr($email,0,1) != "@") && (substr($email,strlen($email)-1,1) != "@")){
           if ((!strstr($email,"'")) && (!strstr($email,"\"")) && (!strstr($email,"\\")) && (!strstr($email,"\$")) && (!strstr($email," "))) {
              //miro si tiene caracter .
              if (substr_count($email,".")>= 1){
                 //obtengo la terminacion del dominio
                 $term_dom = substr(strrchr ($email, '.'),1);
                 //compruebo que la terminacion del dominio sea correcta
                 if (strlen($term_dom)>1 && strlen($term_dom)<5 && (!strstr($term_dom,"@")) ){
                    //compruebo que lo de antes del dominio sea correcto
                    $antes_dom = substr($email,0,strlen($email) - strlen($term_dom) - 1);
                    $caracter_ult = substr($antes_dom,strlen($antes_dom)-1,1);
                    if ($caracter_ult != "@" && $caracter_ult != "."){
                       $mail_correcto = 1;
                    }
                 }
              }
           }
        }
        if ($mail_correcto)
           echo 'valid';
        else
           echo 'no valid';
    }
    function microtime_float()
    {
    list($useg, $seg) = explode(" ", microtime());
    return ((float)$useg + (float)$seg);
    }
    echo microtime_float()."<br />";
    echo comprobar_email1($email)."<br />";
    echo microtime_float()."<br />";
    echo microtime_float()."<br />";
    echo comprobar_email2($email)."<br />";
    echo microtime_float()."<br />"; 
       resultado:  
 Cita:  1335614994.9389
valid
1335614994.9389
1335614994.9389
valid
1335614994.939
    edito: veo que el error está en usar la función microtime_float(),  evidentemente el tiempo va pasando entre la comparativa, voy ha seguir con otas opciones.