O princípio eo desempenho de análise de funções PHP

prefácio

Em qualquer língua, as funções mais básicas são compostas de células. Para a função de php, ele tem que características? chamadas de função é como conseguir? Como função de desempenho php, que recomendações? Este artigo a partir dos princípios estabelecidos para analisar os testes de desempenho reais tentar responder a estas perguntas, escrito em PHP melhor compreensão do programa ao mesmo tempo para conseguir. Mas também alguma função php comum são introduzidos.

função de classificação php

Em php, a divisão transversal, a função é dividido em duas categorias: a função do utilizador (built-in funções) e função interna (built-in função). O método anterior é que algumas funções e no programa definido pelo utilizador, este último é em si php fornecer uma variedade de funções de biblioteca (como sprintf, array_push, etc). Os usuários também podem escrever uma função de biblioteca por meio de extensão, este será descrito mais tarde. Para a função do utilizador, pode ser subdividido em função (funções) e método (métodos de classe), estas três funções no teste de papel e análise, respectivamente.

Php funcionar para alcançar

Uma função php em última análise, como realizar este processo é uma espécie de como ele?

Para responder a esta pergunta, vamos olhar executar código php através do qual o fluxo.

Você pode ver no gráfico, PHP alcançar um típico processo dinâmico linguagem de execução: obter o pedaço de código, por meio de análise léxico depois das fases análise, será traduzido em uma fonte de instruções (opcodes), então o ZEND virtual máquina executa sequencialmente estas instruções para concluir a operação. C próprio PHP é implementado e, portanto, são função final chamada c, de fato, podemos colocar php visto como um desenvolvimento de software c.
Através da descrição acima não é difícil ver que a implementação da função do php também foi traduzido para opcodes para chamar, cada chamada de função é realmente executada uma ou mais instruções.

Para cada função, zend são descritos pela seguinte estrutura de dados

typedef union _zend_function {
    zend_uchar type;    /* MUST be the first element of this struct! */
    struct {
        zend_uchar type;  /* never used */
        char *function_name;
        zend_class_entry *scope;
        zend_uint fn_flags;
        union _zend_function *prototype;
        zend_uint num_args;
        zend_uint required_num_args;
        zend_arg_info *arg_info;
        zend_bool pass_rest_by_reference;
        unsigned char return_reference;
    } common;

    zend_op_array op_array;
    zend_internal_function internal_function;
} zend_function;


typedef struct _zend_function_state {
    HashTable *function_symbol_table;
    zend_function *function;
    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_function_state;
Que Identifica o tipo da função: função do usuário, funções built-in funções, sobrecarregados. Comum contém funções de informações básicas, incluindo o nome da função, as informações de parâmetro, a bandeira de função (uma função comum, métodos estáticos, método abstrato) e assim por diante. Além disso, funções para o usuário, e uma tabela de símbolos função, registra as variáveis internas e afins, este será descrito mais tarde. Zend mantém uma function_table global, esta é uma mesa Hahs grande. Quando a chamada de função vai encontrar o primeiro zend_function correspondente da mesa, de acordo com o nome da função. Quando uma chamada de função quando a máquina virtual, dependendo do tipo de decisão de chamar um método, diferentes tipos de funções, o seu princípio de implementação não é o mesmo .

Built-in funções

Built-in funções, que em essência é a verdadeira função de c, cada um built-in função, php após a compilação final será ampliado para se tornar uma função chamada zif_xxxx, como o nosso sprintf comum, corresponde a parte inferior é zif_sprintf. Zend na fase de execução, se for encontrado para ser construído em função, em seguida, basta fazer uma operação de encaminhamento.

Zend prevê uma série de chamadas de API, incluindo parâmetros de aquisição, operações de matriz, alocação de memória. Built-in função de parâmetros de aquisição, zend_parse_parameters conseguido por um método para matrizes, cordas e outros parâmetros, Zend cópia superficial é conseguida, e, por conseguinte, a eficiência é muito alta. Pode-se dizer, para o php funções internas, eficiência e c função correspondente quase o mesmo, o único mais reencaminhamento de chamadas.

Built-in funções em php são carregados de forma dinâmica para a propósito, os usuários também podem escrever sua própria adequada, de modo necessário, isto é, que muitas vezes dizemos que a expansão. ZEND oferece uma gama de api para Expansão

Funções do usuário

E um built-in função, em comparação com um completamente diferentes usuários e processos realizados pela função princípio implementação personalizada php implementado. Como antes, nós sabemos código php é traduzido em um código de operação bar a ser executado, a função do usuário não é excepção, a função real correspondente a cada código de operação em um conjunto, o conjunto de instruções são armazenados no zend_function. Assim, o utilizador chama a função correspondente ao final é para executar um conjunto de códigos de operação.

  • Preservação de variáveis locais e implementação recursiva 
    sabemos que função recursiva é realizado através da pilha. Em php, é conseguida utilizando um procedimento semelhante. Zend designados para uma tabela de símbolos atividade (active_sym_table) para cada função php, o estado atual função registra todas as variáveis locais. Todos da tabela de símbolos para manter a forma de uma pilha, sempre que houver uma chamada de função, atribuir uma nova tabela de símbolos e pilha. Após o fim do símbolo Expresso pilha de chamadas atual. Conseguindo assim a preservação e estado recursiva.

Para a manutenção da pilha, zend aqui otimizado. Pré-atribuído um conjunto estático de comprimento N para simular a pilha, esta abordagem para simular as estruturas de dados dinâmico em nossos próprios programas muitas vezes têm de usar arrays estáticos, cada chamada evitados desta forma traz alocação de memória, destruída. ZEND apenas no final dos dados atuais símbolo pilha tabela chamada de função pode limpar.
Porque array estático de comprimento N, uma vez que a hierarquia chamada de função de N, o programa não estouro de pilha, zend será atribuído a tabela de símbolos deste caso, destruição, causando, assim, um monte de queda de desempenho. Dentro do zend, N é o valor de corrente de 32. Portanto, quando escrevemos programa php, um nível de chamada de função melhor não mais de 32. Claro, se o próprio aplicativo web pode funcionar profundidade hierarquia de chamadas.

  • parâmetros de transferência 
    e o embutido chamadas de função zend_parse_params para obter diferentes parâmetros, obtendo função parâmetros do utilizador é realizado por uma instrução. Função tem alguns parâmetros correspondentes a algumas instruções. Específico para a realização dessa variável comum.
    Como pode ser visto pela análise acima, e em comparação com built-in funções, uma vez que para manter a sua própria mesa de pilha, cada instrução é executada e uma função c, o desempenho relativo da função de usuário será muito pior, há por trás da análise comparativa específica. Portanto, se uma função php tem um correspondente built-in funções para conseguir o máximo possível para não re-escrever suas próprias funções de alcançar.

Métodos de classe

Métodos de classe da sua aplicação dos princípios e funções do utilizador são o mesmo, e é traduzida em chamadas opcodes sequencialmente. classe de implementação, uma estrutura de dados com Zend zend_class_entry alcançado, que detém algumas informações básicas associadas com a classe. Esta entrada está em php quando o compilador foi processado.

No comum zend_function, existe um membro conhecido do âmbito, que está a apontar para uma classe método zend_class_entry correspondente. Sobre php implementação orientada a objeto, não aqui em mais detalhes introduzidas no futuro será dedicado a escrever um artigo que detalhou os princípios de implementação orientada a objetos em php. É uma função desta peça é, princípio e função método exatamente o mesmo, em teoria, o seu desempenho é semelhante, mais tarde vamos fazer uma comparação detalhada do desempenho.

Comparação de desempenho

O impacto no desempenho do comprimento nome da função

  • Método de Teste 
    para 1,2,4,8,16 comprimento nome como uma função da comparação, comparando a sua segunda frequência de teste executável para determinar o impacto sobre o desempenho do comprimento do nome função
  • Os resultados do teste, como mostrado abaixo

 

  • Os resultados da análise 
    pode ser visto a partir da figura, o comprimento dos nomes de desempenho e função terá efeito. Um comprimento em função do comprimento de 1 a 16, e a  chamada da função em branco  , a diferença de desempenho entre o 1-dobra. Analisar o código fonte não é difícil encontrar razões, como já descrito anteriormente, quando a chamada função irá primeiro zend informações relevantes através do nome da função em um funtion_table global em, function_table é uma tabela hash. Inevitável, o nome do mais longo tempo necessário para consultar a mais. Portanto, quando a programação real, uma função chamada várias vezes, o nome é muito longo não é recomendado

Embora o comprimento do nome da função tem um certo impacto no desempenho, mas a extensão exata dele? Esta questão deve ainda precisa considerar a situação real, se uma função em si é mais complexo, então afetar o desempenho geral não é significativa.
Uma sugestão é para aqueles que vão chamar muitas vezes, a própria função e função relativamente simples que podem ter adequadamente alguns dos nomes concisa.

Efeitos sobre as propriedades do número de funções

  • Método de ensaio 
    para testar a chamada de função, os resultados da análise em três ambientes seguintes: um programa contém apenas uma função 2. Função 3 100 contém programa compreendendo programa 1000 funções.
    O número de testes que pode ser uma chamada de função por segundo três casos
  • Os resultados do teste, como mostrado abaixo

 

  • Os resultados da análise 
    podem ser visto a partir dos resultados do teste, quase o mesmo desempenho todos os três casos, o número de funções aumenta a degradação do desempenho é mínima e pode ser ignorado.
    Desde a realização da análise princípio, a única diferença é que parte da função sob várias implementações adquiridos. Tal como anteriormente descrito, todas as funções de uma tabela de hash, o número de diferente eficiência de busca deve ainda perto de O (1), de modo que pouca diferença de desempenho.

O consumo de diferentes tipos de chamadas de função

  • Método de ensaio 
    selecionado funções do usuário, métodos de classe, métodos estáticos, um para cada função, a função em si não faz nada diretamente para trás, consomem chamada principal em built-vazia função de teste. Os resultados do teste para o número de vezes por segundo executável 
    teste, a fim de remover outros efeitos, todos os nomes das funções do mesmo comprimento
  • Os resultados do teste, como mostrado abaixo

 

  • Os resultados da análise 
    podem ser visto através dos resultados dos testes para a função php preparados pelo utilizador, não importa o tipo, e sua eficiência é aproximadamente o mesmo, tanto em 280W / s ou mais. Como esperávamos, mesmo com ar condicionado, embutido funções que têm muito maior eficiência, o alcance 780W / s, o primeiro é três vezes. Visível, embutido chamada função de sobrecarga é muito menor do que a função de utilizador. A partir dos programas de análise que precede que a principal diferença de princípio em que a chamada de função, quando o utilizador inicia a tabela de símbolos, os parâmetros de operação de recepção.

Built-in funções e funções do utilizador comparação de desempenho

  • Método de ensaio 
    construído funções de comparação de desempenho e funções do utilizador, onde nós escolhemos algumas funções comuns e alcançar a mesma funcionalidade com php sobre a comparação de desempenho da função.
    Teste, foram selecionados cadeia, matemática, uma matriz típica para cada comparação, estas funções são tomadas cadeia (substr), 10 de transferência de binário decimal (decbin), para o mínimo (min) e um retorno matriz para chave (array_keys).
  • Os resultados do teste, como mostrado abaixo 

 

 

  • Os resultados da análise 
    podem ser visto a partir dos resultados dos testes, como esperávamos, built-in função é muito maior do que as funções usuário médio no desempenho geral. Especialmente para as funções relacionadas com a operação da classe corda, o desfasamento atingiu uma magnitude. Portanto, se um princípio é uma função dos correspondentes usa a função built-in funções, tentar usá-lo em vez de escrever sua própria função php.
    Para algumas operações que envolvem grande função de cadeia, melhorar o desempenho, considere o uso de extensões de implementar. Tais como a filtragem de texto rico comum.

função C e comparação do desempenho

  • Métodos de teste 
    Selecionamos a manipulação de cadeia e operações aritméticas de três tipos de funções, PHP alcançados com a extensão. Três tipos de função é uma operações aritméticas simples, comparação de string e múltiplas operações aritméticas.
    Para além dos dois tipos de função em si, mas também para testar o desempenho da função de remoção do ar condicionado em cima, por um lado sobre o desempenho do que a diferença entre as duas funções (c e php construído) em si, e o outro lado é confirmada consumo de ar condicionado função 
    ponto de teste tempo para executar as operações de consumo 10w
  • Os resultados do teste, como mostrado abaixo

 

  • Análise dos resultados de 
    funções internas e funções C sobrecarga após a remoção da função de impacto de ar condicionado uso php intervalo menor, como uma função das funções mais complexas, os dois lados estreitos com o mesmo desempenho. Antes de esta função pode ser facilmente obtida a partir da análise foi demonstrado, depois de tudo, embutido funções que a implementação C.
    Função funções mais complexas, o desempenho lacuna c e php menor 
    relativamente falando c, chamada de função php sobrecarga é muito maior, pois é simplesmente uma função do desempenho ainda tem alguma influência. Assim não função em php aninhada profunda pacote.

função pseudo e suas propriedades

No PHP, há uma série de funções, que são padrão no uso da utilização da função, mas a implementação subjacente era completamente diferente ea chamada função real, essas funções não pertencem a qualquer um de uma função de três anteriormente mencionado na sua essência é um único código de operação, que se refere no presente documento e a função função pseudo ou comando estimado.

Como mencionado acima, a função pseudo padrão e utilizar nenhuma função diferente, parece ter as mesmas características. No entanto, quando eles são executados última zend refletido instrução (opcode) tornou-se um correspondente às chamadas, por isso é mais perto de alcançar se, para, operações aritméticas e outros.

  • função pseudo em php 
    Isset 
    esvaziar 
    o unset 
    o Eval

Como pode ser visto pela descrição acima, a função pseudo-devido a ser directamente traduzido em instruções para executar, e menos sobrecarga em comparação com uma chamada de função a função normal traz, de modo que o desempenho será melhor. Nós fazemos uma comparação pelo teste seguinte. Ambos variedade array_key_exists e isset pode determinar se há uma chave, olhar para o seu desempenho

 

Como pode ser visto a partir da figura, e array_key_exists comparação, isset um desempenho muito superior, substancialmente cerca de 4 vezes a primeira, e até mesmo em comparação chamada de função nulo, comparando o seu desempenho deve ser de cerca de 1 vezes. Isto também confirma, mais uma vez mostra a chamada função php lado sobrecarga é relativamente grande.

Implementação e introduzir a função php comum

contagem

contagem é uma função muitas vezes usamos, sua função é retornar um array de comprimento.

contar esta função, a sua complexidade é quanto? 
Um argumento contagem comum é os laços de função através da matriz e o número de elementos é obtida, e, por conseguinte, a complexidade é O (n). Que a realidade não é assim?
Nós olhamos para trás para perceber a contagem pode ser encontrada através do código-fonte para a operação de contagem da matriz, a função caminho final é zif_count-> php_count_recursive-> zend_hash_num_elements e comportamento zend_hash_num_elements é o retorno ht-> nNumOfElements, ver, esta é uma O (1) em vez de operações (n) S. Com efeito, a matriz subjacente é uma hash_table php, para a tabela de Hash, há um elemento especial no Zend nNumOfElements regista o número do elemento de corrente, e, portanto, a contagem média para substancialmente directamente devolve este valor. Assim, conclui-se que:  COUNT é independente do tamanho ó (1) a complexidade, e matrizes específicas.

tipo não-conjunto de variáveis, como contar o comportamento tempo?
Para a variável de retorno não está definido para 0 e, como int, double, corda e similares retornará 1

strlen

Strlen usado para retornar um comprimento de corda. Então, como é a sua realização do princípio de que?
todos sabemos a strlen c é uma função f (n), a sequência irá atravessar a corda até que ele / 0, então o comprimento. Php seja dessa maneira? A resposta é não, corda php numa estrutura compósita é descrito, incluindo um ponteiro que aponta para o comprimento de cadeia de dados específica e (c ++ e semelhante para a cadeia), e, por conseguinte, directamente devolvido comprimento de cadeia strlen, a operação é um nível constante .
Além disso, para as chamadas tipo de variável não-corda strlen, primeiro é fundido a cadeia de caracteres de comprimento variável e, em seguida, pedido, que precisa de atenção.

isset 和 array_key_exists

O uso de dois mais comuns da função é para determinar se existe uma chave na matriz. Mas o primeiro pode também ser configurado para determinar se uma variável é definida também.
Como mencionado anteriormente, não é realmente um isset função, pelo que a sua eficiência é muito maior do que o último. Uso recomendado que em vez array_key_exists.

array_push 和 matriz []

Ambos são acrescentados ao fim do elemento de matriz. A diferença é que o primeiro pode empurrar mais uma vez. Sua maior diferença é que um é uma função da estrutura da linguagem, que a eficiência é maior. Então, se apenas comum elementos adicionais, recomenda-se a matriz de uso [].

rand e mt_rand

Ambas as funções são fornecidas para a geração de números aleatórios, utilizando a primeira margem libc padrão. A última utilização as características conhecidas de Mersenne tornado gerador de números aleatórios que pode gerar aleatoriamente valor rand relação de velocidade média fornecida pelo libc () quatro vezes mais rápida. Então, se requisitos de alto desempenho, pode ser considerado no lugar do antigo com mt_rand.
Como todos sabemos, margem é gerado de números pseudo-aleatória, necessidade de utilização srand em C para apresentar a semente especificado. Mas em php, rand vai ajudar você possui um srand de chamada padrão, não há necessidade de chamá-los novamente exibida em circunstâncias normais.
Note-se que, se você precisa chamar srand casos excepcionais, certifique-se de chamadas completas. Isso srand para o rand, mt_srand correspondem srand, não deve ser misturado, caso contrário, é inválido.

classificar e usort

Ambos são usados para classificar, exceto que ele pode especificar a estratégia espécie, semelhante à nossa C e C ++ dentro qsort do tipo.
Ambos estão no tipo de padrão para alcançar linha rápido, para uma espécie de demanda, como circunstâncias não-especiais para chamar esses métodos fornecem php nele, não tem que re-implementá-lo novamente, a eficiência é muito menor. Veja motivo supra para análise de funções do usuário e built-in funções de comparação.

urlencode 和 rawurlencode

Ambos são usados para codificar URL, excepto -_ do que a cadeia. Todos os caracteres não alfanuméricos serão substituídos com um por cento (%), seguido de dois dígitos hexadecimais. A única diferença é que, para o espaço, irá ser codificada urlencode +, e 20% rawurlencode ser codificado.
Além de motores de busca, os nossos espaços de estratégia são codificados como 20% em circunstâncias normais. Assim a maioria deste último.
Note-se que codificar e descodificar a série deve ser apoio à utilização.

Série função strcmp

Esta série inclui a função strcmp, strncmp, strcasecmp, strncasecmp, para conseguir as mesmas funções e funções C. No entanto, existem também diferente, já que a corda é permitido php / 0 ocorre, é determinado por isso, quando o fundo é usado em vez de séries memcmp strcmp, em teoria, mais rápido.
Além disso, como pode ser obtido comprimento da cadeia directamente php, assim este primeiro aspecto da inspecção, a eficiência em muitos casos, será muito maior.

is_int 和 is_numeric

Estas duas funções não são funções idênticas uso semelhante do tempo eles precisam prestar atenção a algumas das diferenças.
Is_int: determinar se um tipo variável é um tipo inteiro, php variável que caracteriza um tipo específico de campo, de modo que este tipo pode ser determinada directamente, é um O absoluto (1) as operações 
is_numeric: determinar se a variável é um número inteiro ou uma cadeia numérica , isto é, para além de uma variável inteiro retornos verdadeiros do que, para as variáveis de cadeia, se a forma de "1234", "1E4", etc. será julgada como verdadeiro. Desta vez vai atravessar o julgamento string.

Resumo e recomendações

Através da realização do princípio da análise de funções e testes de desempenho, concluímos as seguintes conclusões

1. chamada de função php sobrecarga é relativamente grande.

2. Função informações relacionadas são armazenados em um grande hash_table, olhar na tabela hash pelo nome da função de cada chamada, de modo que o comprimento do nome de função também ter algum impacto sobre o desempenho.

3. Devolve uma referência discutível

4. Built-in funções php desempenho do usuário do que muitas funções, particularmente para classe string operando.

5. métodos de classe, ordinária, eficiência método estático é quase o mesmo, não há muita diferença

6. O impacto de remover a chamada de função vazio, o mesmo built-in funções e recursos de desempenho da função C quase todos os mesmos.

7. Todos os parâmetros são passados ​​cópia superficial a contagem de referência, um pequeno preço.

8. O número de funções negligenciável impacto no desempenho

Portanto, para a função uso php, a seguir estão algumas sugestões

1. Uma característica completa com built-in funções, tentar usá-lo em vez de tentar função de gravação php.

2. Se uma característica dos requisitos de alto desempenho, considere o uso de extensões de implementar.

3. chamada de função php sobrecarga é grande, por isso não sobre-embalados. Algumas funções, se o número de vezes que você precisa chamar-se um lote com apenas 2 linhas de código implementado na linha, não recomendo o pacote chamado.

4. Não excesso de obcecado com vários padrões de design, como uma descrição, embalagem excessiva trará a degradação do desempenho. Necessidade de considerar o trade-off entre os dois. Php tem suas próprias características, não deve ser mera imitação, muito java a seguir o padrão.

5. Função não deve ser profundamente aninhados, tenha cuidado recursiva.

6. -Função pseudo alto desempenho, de acordo com a mesma função para a realização de prioridades. Por exemplo, em vez de usar Isset array_key_exists

7. Função retorna uma referência não faz muito sentido, mas não há nenhum efeito prático, não é recomendado ser considerado.

8. membro da classe de eficiência método do que uma função comum é baixa, então não se preocupe sobre a perda de desempenho. Ele recomenda que métodos mais consideração estáticas e segurança são melhor legibilidade.

9. Se não for necessidades especiais, recomendamos o uso de parâmetros passados ​​por valor, em vez de passar por referência. Claro, se o parâmetro é uma grande necessidade de modificar a matriz e pode ser considerado quando passados ​​por referência.

 

 

 

 

Publicado 80 artigos originais · Louvor obteve 96 · vista 360 000 +

Acho que você gosta

Origin blog.csdn.net/Alen_xiaoxin/article/details/104888627
Recomendado
Clasificación