Diferença de velocidade na utilização de strings inline vs concatenação no php5?

(suponha php5) considere

 

Existe muita diferença entre 1 e 2?

Se não, o que dizer entre 1/2 e 3?

Bem, como com todas as perguntas “O que pode ser mais rápido na vida real”, você não pode vencer um teste da vida real.

 function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); $times[$i] = microtime() - $time; } return array_sum($times) / $runs; } function Method1() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are $foo"; } function Method2() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}"; } function Method3() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n"; 

Dê-lhe algumas corridas para paginar tudo, então ...

0,0035568

0,0035388

0,0025394

Portanto, como esperado, a interpolação é praticamente idêntica (diferenças de nível de ruído, provavelmente devido aos caracteres extras que o mecanismo de interpolação precisa controlar). A concatenação direta é de cerca de 66% da velocidade, o que não é um grande choque. O analisador de interpolação procurará, não encontrará nada para fazer e terminará com uma concatenação de cadeia interna simples. Mesmo se o concat fosse caro, o interpolador ainda teria que fazê-lo, após todo o trabalho de analisar a variável e aparar / copiar a string original.

Atualizações por Somnath:

Eu adicionei Method4 () a lógica em tempo real acima.

 function Method4() { $foo = 'some words'; for ($i = 0; $i < 10000; $i++) $t = 'these are ' . $foo; } print timeFunc('Method4', 10) . "\n"; Results were: 0.0014739 0.0015574 0.0011955 0.001169 

Quando você está apenas declarando uma string apenas e não precisa analisar essa string também, então por que confundir o depurador PHP para analisar. Eu espero que você tenha o meu ponto.

A diferença de desempenho é irrelevante desde pelo menos janeiro de 2012 e, provavelmente, antes:

 Single quotes: 0.061846971511841 seconds Double quotes: 0.061599016189575 seconds 

Versões anteriores do PHP podem ter tido uma diferença – eu pessoalmente prefiro aspas simples para aspas duplas, então foi uma diferença conveniente. A conclusão do artigo faz um excelente ponto:

Nunca confie numa estatística que você não forjou.

(Embora o artigo cite a frase, o original provavelmente foi falsamente atribuído a Winston Churchill, inventado pelo ministério da propaganda de Joseph Goebbels para retratar Churchill como um mentiroso:

Ich traue keiner Statistik, ich nicht selbst gefälscht habe.

Isso se traduz, vagamente, em “Não confio em uma estatística que não me enganei”.

Benchmarks ao vivo:

http://phpbench.com/

Na verdade, há uma diferença sutil ao concatenar variables ​​com aspas simples e duplas.

@ Teste de Adam usado

 "these are " . $foo 

Observe que o seguinte é ainda mais rápido:

 'these are ' . $foo; 

isso se deve ao fato de que uma “string” entre aspas duplas é avaliada, onde uma única “string” citada é apenas tomada como é …

Não fique muito envolvido tentando otimizar as operações de string no PHP. A concatenação versus interpolação não tem sentido (no desempenho do mundo real) se suas consultas ao database estiverem mal escritas ou se você não estiver usando nenhum tipo de esquema de armazenamento em cache. Escreva suas operações de string de forma que a debugging do seu código mais tarde seja fácil, as diferenças de desempenho são insignificantes.

@uberfuzzy Supondo que isso seja apenas uma questão sobre a minúcia da linguagem, acho que está tudo bem. Eu estou apenas tentando adicionar à conversa que comparar o desempenho entre aspas simples, aspas duplas e heredoc em aplicativos do mundo real, sem sentido, quando comparado aos dissipadores reais de desempenho, como consultas de database ruins.

Quaisquer diferenças no tempo de execução são completamente insignificantes.

Por favor, veja

  • Blog do NikiC: Reprovando o Mito de Performance de Quotes Únicas para uma explicação técnica de como a interpolação e a concatenação funcionam em PHP e por que é absolutamente inútil se preocupar com sua velocidade.

Não perca tempo com micro-otimizações como essa. Use um profiler para medir o desempenho de seu aplicativo em um cenário do mundo real e, em seguida, otimize onde ele é realmente necessário. A otimização de uma única consulta de database malfeita provavelmente resultará em uma melhoria de desempenho maior do que a aplicação de micro-otimizações em todo o seu código.

Eu pareço lembrar que o desenvolvedor do software do fórum, Vanilla substituiu todas as aspas duplas em seu código com aspas simples e notou uma quantidade razoável de aumento de desempenho.

Eu não consigo rastrear um link para a discussão no momento.

há uma diferença ao concatenar variables ​​… e o que você está fazendo com o resultado … e se o que você está fazendo é despejá-lo na saída, é ou não está ativado o buffer de saída.

também, qual é a situação de memory do servidor? Normalmente, o gerenciamento de memory em uma plataforma de nível superior é pior do que em plataformas inferiores …

 $a = 'parse' . $this; 

está gerenciando memory no nível da plataforma de código do usuário …

 $a = "parse $this"; 

está gerenciando memory no nível da plataforma de código do sistema php …

então esses benchmarks relacionados à CPU não contam a história completa.

executando o benchmark 1000 vezes vs executando o benchmark 1000 vezes em um servidor que está tentando executar a mesma simulação 1000 vezes simultaneamente … você pode obter resultados drasticamente diferentes, dependendo do escopo do aplicativo.

Aspas duplas podem ser muito mais lentas. Eu li em vários lugares que é melhor fazer isso

 'parse me '.$i.' times' 

do que

 "parse me $i times" 

Embora eu diria que o segundo lhe deu um código mais legível.

Praticamente não há diferença alguma! Veja os horários: http://micro-optimization.com/single-vs-double-quotes

Apenas para adicionar algo mais ao mix, se você estiver usando uma variável dentro de uma syntax de strings entre aspas duplas:

 $foo = "hello {$bar}"; 

é mais rápido que

 $foo = "hello $bar"; 

e ambos são mais rápidos que

 $foo = 'hello' . $bar; 

Deve-se notar que, ao usar uma versão modificada do exemplo de Adam Wright com 3 variables, os resultados são invertidos e as duas primeiras funções são realmente mais rápidas, consistentemente. Isso é com o PHP 7.1 na CLI:

 function timeFunc($function, $runs) { $times = array(); for ($i = 0; $i < $runs; $i++) { $time = microtime(); call_user_func($function); @$times[$i] = microtime() - $time; } return array_sum($times) / $runs; } function Method1() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are $foo, $bar and $bas"; } function Method2() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are {$foo}, {$bar} and {$bas}"; } function Method3() { $foo = 'some words'; $bar = 'other words'; $bas = 3; for ($i = 0; $i < 10000; $i++) $t = "these are " . $foo . ", " . $bar . " and " .$bas; } print timeFunc('Method1', 10) . "\n"; print timeFunc('Method2', 10) . "\n"; print timeFunc('Method3', 10) . "\n"; 

Eu também tentei com '3' em vez de apenas o inteiro 3, mas recebo o mesmo tipo de resultados.

Com $ bas = 3:

 0.0016254 0.0015719 0.0019806 

Com $ bas = '3':

 0.0016495 0.0015608 0.0022755 

Deve-se notar que estes resultados variam muito (eu recebo variações de cerca de 300%), mas as médias parecem relativamente estáveis ​​e quase (9 em 10 casos) sempre mostram uma execução mais rápida para os 2 primeiros methods, sendo o Método 2 sempre ligeiramente mais rápido que o método 1.

Em conclusão: o que é verdade para uma única operação (seja interpolação ou concatenação) nem sempre é verdadeiro para operações combinadas.