PHP7 vs PHP5 comparando desempenho


O Lançamento do PHP 7 não e necessariamente uma novidade, isso todos nós sabemos mas fiquei encucado com o real desempenho dele, e acabei optando por realizar alguns testes, então vamos aos testes!

O PHP 7 Traz enumeras vantagens em relação ao seu antecessor (PHP 5) e a que mais me chamou a atenção, supostamente ele pode ser até 9 vezes mais rápido e ele realmente é?
Pois bem, fiz os testes e ele se comportou incrivelmente bem em testes de desempenho focados somente em processamento ao lado do servidor. 

E vamos aos testes:

Testes PHP 7.0 PHP 5.6
simple 0.096 0.292
simplecall 0.016 3.074
simpleucall 0.090 3.316
simpleudcall 0.095 3.336
mandel 0.288 1.164
mandel2 0.318 1.080
ackermann(7) 0.086 2.243
ary(50000) 0.006 0.057
ary2(50000) 0.005 0.037
ary3(2000) 0.128 0.504
fibo(30) 0.246 8.258
hash1(50000) 0.020 0.362
hash2(500) 0.016 0.045
heapsort(20000) 0.060 0.313
matrix(20) 0.058 0.246
nestedloop(12) 0.138 0.518
sieve(30) 0.032 0.257
strcat(200000) 0.008 0.037
Total 1.706 25.140

Configuração utilizada para os testes: 

  • Sistema Operacional : Windows 7
  • Memória Ram: 6 GB DRR 3 1200Mhz
  • Processador: i5-2400 @ 3,10GHZ
  • Apache:  2.4.23
  • PHP 5.6.25 e PHP 7.0.10
Quanto menor o valor melhor, então como podem ver o PHP 7 está significativamente mais rápido que seu antecessor. Caso queria realizar o teste ele está disponível no GitHub para baixar o código basta seguir no seguinte Link: zent/bench.php, baixar e executar, recomendo executar diretamente pelo terminal ou Prompt de comando. (Caso não saiba como executar pelo terminal comenta que tentarei ajudar).

Além da melhora no desempenho ele novos recursos. e a remoção de outros. 

Novos recursos do PHP 7

1) Desempenho:

Seu incrível desempenho, e o que me levou a realizar os test e publicar esse post. 

2) Mudança no tratamento de Erros Fatais:

Por exemplo. caso você realize a seguinte script:
O código a seguir não iria imprimir o echo pois essa função não existe e consequentemente código não ira prosseguir:
 
qualquer_erro();
 echo "Com erro o codigo nao procede";

Fatal error: Uncaught Error: Call to undefined function qua...

Agora quando utilizamos o seguinte exemplo:
 
try {
 qualquer_erro();
} catch (Error $e) {
 echo "Ocorreu um erro: " . $e->getMessage();
}
echo "Mesmo com erro o codigo procede";

Ocorreu um erro: Call to undefined function qualquer_erro()
Mesmo com erro o código procede


Será exibido a mensagem de erro com a diferença que o código não irá executar como erro fatal e consequentemente prosseguindo com a execução.

3) Indução de Tipos: Scalar Types:

O PHP não é uma linguagem tipada (saiba mais sobre Linguagem Tipada).

Aos poucos ela vem ganhando alguns recursos que a torna fracamente tipada.

Isso significa que podemos criar códigos mais consistentes e menos suscetíveis a erros e problemas.

O PHP 5 já possui o recurso de Indução de Tipos.

É possível definir alguns tipos para parâmetros de métodos e funções. Mas só é possível definir dois tipos: arrays (o tipo “array”) e objetos (com o nome da classe).

A partir do PHP 7, poderemos usar outros tipos também: int, float, string e bool.

Esses tipos podem ser definidos nos parâmetros de funções e métodos, como já era feito no PHP 5. Mas agora há uma novidade: também poderemos definir o tipo do retorno.

4) Tipo de Retorno de Funções e Métodos:

O PHP 7 vai permitir definir o tipo de retorno de uma função ou método.
Por exemplo:
 
function test($a, $b): float
 {
  return $a + $b + 1.5; 
 }
 var_dump(test(1.5, 2.8));

float 5.8

O retorno será oque foi predeterminado, nesse caso o float, também podendo usar todo o tipo de retorno como int, float, string, bool, array e objeto.

5) Um novo Operador Spaceship():

Esse novo operador tem o nome de "Spaceship" ele é muito similar a função strcmp() que pode ser usar para comparar 2 operadores.

 
    var_dump(5 <=> 3); // retorna 1
    var_dump(10 <=> 10); // retorna 0
    var_dump(-2 <=> -1); // retorna -1


Em outras palavras ele irar retornar 1 quando o primeiro operador for maior, 0 quando forem iguais, e -1 quando o primeiro for menor que o segundo.

6) Null Coalesce Operator (operador ??)

Ele é muito similar ao isset() o qual utilizamos para verificar a existência variáveis como utilizandos o isset() em $_GET ou $_POST.

Veja como ficaria a utilização do "??"

 
$email = $_GET['email'] ?? 'valor padrão';
$email = isset($_GET['email']) ? $_GET['email'] : 'valor padrão';

echo $email;

Utilizando o Operador "??" como na primeira linha teria o mesmo resultado que utilizar o isset juntamente da definição da variável. PS: Muito pratico 

7) Classes Anônimas

Desde a versão do PHP 5.4 já é permitida a criação de funções anônimas as quais são muito úteis para criação da callbacks, vamos a um exemplo:

Fazendo uso de funções anônimas; (exemplo simples)
Funções anonimas, também conhecidas como closures, permitem a criação de funções que não tem o nome especificado. Elas são mais úteis como o valor de parâmetros callback, mas podem tem vários outros usos.

Exemplo de como definir uma função anonima para uma variável:

 
$greet = function($name){
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

Fazendo uso do array_map()

Aplica uma função em todos os elementos dos arrays dados:
 
function cube($n){
    return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
//RETORNO
Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)


Retornando uma classe definida dentro da função:
 
function createObject(){
    return new class{
        public function test()
        {
            echo "test END OF LIFE =>" . PHP_EOL;
        }
    };
} 
$obj = createObject();
$obj->test();


Nesse exemplo temos acesso ao objeto test() diretamente em $obj;

Mudanças do PHP 7

Algumas funções do PHP foram removidas definitivamente no PHP 7 como por exemplo a nossa velha conhecida mysql_connect... que já é reconhecida como obsoleta dentre outras alterações.

1) Remoção do mysql_*

Pois bem o mysql_* foi removido isso é (mysql_connect(), mysql_query()), elas ainda funcionavam no PHP 5.5 mas já eram consideradas como recurso obsoleto (Deprecated).
A alternativa é a utilização do mysqli_* ou do aclamado PDO o qual recomendo fortemente sua utilização.

2) Funções ereg_* Removidas

Juntamente das funções mysql_* as funções ereg_* foram removidas, como: ereg(), ereg_replace, eregi(), as quais já eram consideradas obsoletas desde o PHP 5.3.

Agora é necessário utiliar a biblioteca PREG como: pre_mach(), preg_replace().

Particularmente eu nunca chgei a utilizar o ereg pois ja cheguei no php utilizando o php 5.3.


3) Construtores do PHP 4 Obsoletos

Nos primórdios da orientação a objeto do PHP isso é antes do PHP 5 era necessário denominar os construtores do mesmo nome que a classe:
 
class classeTriste
    {
        function classeTriste()
        {
            echo "Construtor chamado";
        }
    }


Agora não é necessário fazer essa gambiarra feia sem contar que também demandaria mais tempo para manutenção do código.

Com  o PHP 7 ficaria assim:
 
class PhpFeliz
{
    public function __construct()
    {
        echo "Construtor chamado";
    }
} 


No PHP 7 recomenda-se a utilização do método __construct pois o construtor padrão do PHP 4 ainda funciona porem já está como obsoleto (Deprecated).

Conclusão:

Em poucas palavras pois acabei escrevendo mais do que imaginei o PHP 7 traz novos recursos porem ao meu ver o real destaque dele seja seu desempenho que está surpreendente melhor que seu antecessor.
As novas novas funções que ele traz facilitam e agilizam muito a produção e a qualidade do código. Particularmente eu gostei muito das Classes anônimas e dos operadores Coalesce.

Então isso é tudo!

Referencias:


https://tableless.com.br/


Se vocês gostaram desse Post não deixe de compartilhar com seus amigos!!!
E para não perder nenhuma novidade nos sigam nas redes sociais:
Twitter: @Bulfaitelo
Facebook: Bulfaitelo Project
Blogger: Bulfaitelo Project
Share on Google Plus

About Thiago Rodrigues

Formado em Sistema de Informação pela Faculdade Paraíso
O que falar de mim? Não á muito, mas garanto que meu objetivo aqui é somente ajudar!
Atualmente desenvolvendo o projeto do QiEstudo.

Comentários
0 Comentários

0 comentários:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.