Referência: strtotime() vs vs DateTime DateTime::getTimestamp em PHP

Última escrevi sim, como você pode implementar as comparações de data em PHP. No artigo, apresentei duas abordagens. Com a ajuda do strtotime ()-Methode e no outro com a classe DateTime.

Nos comentários eu estava apontada para fora, em seguida, por Christoph, que o strtotime ()-Variante foi provavelmente mais rápido. Ele no entanto não era tão completamente seguro próprio também, então eu decidi um pequeno teste de desempenho, os resultados dos quais eu gostaria de apresentá-lo aqui em breve vezes.

O que eu testei?

Desde a pergunta sobre o strtotime() vs objectivos DateTime, fornece mais funcionalidade para a classe DateTime no contrário para o strtotime ()-Funktion no entanto, criar o objeto DateTime com a classe DateTime + medido a saída dos carimbos de hora. Então o tempo para a saída idêntica é medido.
Como entrada, tomei uma data sem um tempo – diz uma parte do dia, mês e ano. Também mandei ainda uma terceira função na corrida. Vou explicar o que é exatamente com o getTimestamp ()-Funktion para, mais para baixo no artigo. As três chamadas de método comparativo para meu teste são os seguintes:

strtotime () $a = strtotime (“2012-05-28”); //datetime$date=new = DateTime (“2012-05-28”); $a $date-> getTimestamp (); $a (//getTimestamp) campos = getTimestamp(“2012-05-28”);

Como eu testei?

Como referência, eu queria mostrar um período de tempo em segundos. A tempo, eu usei as seguintes funções:

Tempo antes da execução de uma variante$ startTime = microtime(true); / * * * variante/teste * ///Zeitpunkt após o fim do teste$ endTime = microtime (true); //Zeitspanne do teste$ elapsedTime = abs ($) startTime – $endTime);

Cada uma das funções foi chamada em um loop de 100.000 vezes e o tempo limite para as 100.000 chamadas. Para compensar flutuações e medição imprecisões do caminho para ir, foi realizada a medição para cada variante 20 vezes e a média de 20 medições feitas. Finalmente, o código para medição de uma variante olhou como segue:

$total = 0; para (= 0; $runs $runs< 20;="" $runs++){="" $starttime="microtime(true);" for="" ($i="0;" $i="">< 100000;="" $i++)="" {="" funktion/variante="" ausführen="" }="" $endtime="microtime(true);" $total="" +="abs($startTime" -="" $endtime);}$elapsedtime="sprintf("%.4f" sec.",="">

Também acrescentei a seguinte linha de código no início dos scripts de referência para definir o fuso horário para o strtotime ()-bem como a variante de DateTime.

date_default_timezone_set(“Europe/Berlin”);

Escrito que eu tenho que correr o servidor de Web Express de código de teste no Web Matrix 2 e também através de seu IIS fornecido com. O ambiente de teste de hardware olhou como segue:

  • Acer Aspire 5740 G (caderno)
  • Intel Core i3 M 330 @ 2.13 GHz
  • 8 GB DE RAM
  • Windows 8 Pro (64 bits)

Como é o resultado da falha?

Então, o resultado foi como ele já tinha suspeitado Christoph. A variante de DateTime foi cronometrada (se também bastante escassa) por trás do strtotime ()-Funktion. A () getTimestamp-Funktion levou o segundo lugar. Na inicial testes nesta seção nem tão bem, que fez o primeiro lugar. No entanto, aqui está alguns cálculos que eles finalmente tem catapultado para segundo lugar estavam faltando.

Eu já resumi o tempo todo em dois pequenos gráficos.

php_date_to_timestamp_benchmark1

php_date_to_timestamp_benchmark_percent

O que é o getTimestamp ()-Funktion para?

A () getTimestamp-Funktion não é função oficial de PHP, mas um pequeno desenvolvimento in-house por mim. Depois que eu tinha feito alguns testes com o strtotime ()- e a variante de DateTime, queria ver se pode me fazer nem sequer uma variante mais rápida. Como mostrado nos gráficos acima, que infelizmente não é bem sucedido em mim.Em testes iniciais isto tinha trabalhado para fora embora, mas eu fui alertado nos comentários sobre ele que o getTimestamp ()-Funktion retornaria valores não é sempre corretos.
Depois que eu adicionei ainda a transição para o tempo de verão e de inverno (para o nosso espaço – na América serão convertidos para outro dados!), minha função agora é mais lenta que o strtotime ()-Funktion.

Minha função getTimestamp parecido com este:

função getTimestamp($timeStr) {$daysInMonth = array(0,31,59,90,120,151,181,212,243,273,304,334); $dateArr = $days explode (“-“, $timeStr); //Tag adicionar anos para definir o ano = ($dateArr [0] -1970) * adicionar 365; //Schaltjahrestage para ($i = 1972; $i) <= $datearr[0];="" $i+="4)" {="" if="" (($i%4="=0" &&="" $i%100="" !="0)" ||="" $i%400="=0)" $days++;="" }="" tage="" bis="" zum="" 31.03.="" des="" jahres="" $daystimeswitch="$days" +="" 90;="" per="" mod="" +="" 3="" wochentag="" bestimmen.="" (+3="" da="" 01.01.1970="Donnerstag)" wochentag="" vom="" 31.="" abziehen="letzter" sonntag="" im="" monat="">Horário de verão $daySummertime = 31 – ((($daysTimeswitch %7) + 3) %7); //Tage a partir de 31 de março do ano $daysTimeswitch $days = + 304; //Per MOD + 3 determinar o dia da semana. (+ 3 da 01.01.1970 = Donnerstag) retirar //Wochentag até o 31 = último domingo do mês => horário de verão $dayWintertime = 31 – ((($daysTimeswitch %7) + 3) %7); Se ((3 > $dateArr [1] && $dateArr [1] < 10)="" ||="" ($datearr[1]="=" 3="" &&="" $datearr[2]=""> $daySummertime) |) ($dateArr [1] = = 10 & $dateArr [2] <= $daywintertime))="" {="" $summerwintertime="3600;" }="" else{="" $summerwintertime="0;" }="" schaltjahr-tag="" abziehen,="" wenn="" monat="" februar="" des="" laufenden="" jahr="" nicht="" inkludiert="" $days="" -="(($dateArr[0]%4==0" &&="" $datearr[0]%100="" !="0)" ||="" $datearr[0]%400="=0)" ($datearr[1]="">2)? 0: 1:0, //Tage por meses do ano atual Adicionar + $days = item $daysInMonth [$dateArr -1 [1]]; //Tage do ano atual Adicionar $days + = $dateArr [2] – 1; / / remove 3600 segundos para o tempo de deslocamento. (Unix-timestamp/UTC) retornar $days * 86400-3600-$summerWinterTime;}

Quem leu o código-fonte da função, vai querer chorar agora, mas talvez “segurar vezes…”. Sim, corretamente devo admitir que minha função apenas sob certas circunstâncias fornece valores corretos. Seguintes condições devem ser atendidas:

  • A data deve ser passada no formato AAAA-MM-DD
  • A data não deve ser mais velha, a partir de 1 de janeiro de 1970

O strtotime ()-Funktion leva, por exemplo, dados em outros formatos e pode calcular um determinado âmbito de também timestamps para dados anteriores a 1 de janeiro de 1970. Aqui a minha função é claramente em desvantagem, e você pode se perguntar se a comparação é então não injustificada. No entanto, um deve lembrar que a classe DateTime por sua vez oferece maior funcionalidade do que o strtotime ()-Funktion.
E como foi no benchmark simplesmente para gerar um timestamp de uma determinada data, acho que minha função tem sua raison d’ ‘ être. Porque corretamente o cálculo de UNIX-timestamp começa a 1 de janeiro de 1970, e, portanto, a minha função atende os requisitos básicos para o cálculo de um timestamp UNIX.

Conclusão

Esse strtotime() é mais rápido que DateTime, podiam ser cobertas no teste. Eu também poderia determinar que, pelo menos para mim, não é possível escrever um mais rápido a função de strtotime(). No início dos testes, eu pensei que se eu iria restringir ao mínimo, eu poderia escrever uma função mais rápida. Finalmente, o strtotime ()-Funktion pode mais do que minha getTimestamp() algumas coisas. No entanto, não funcionou.

Em última análise, a escolha do método no contexto do projeto deve ser feita. Em que formato (s) são os dados? Eu cobraria talvez ainda mais do que apenas o carimbo de hora?

Finalmente, outra questão na rodada: alguém de vocês já tentou uma função mais rápida do que to escrever o strtotime ()-Funktion? E se então, que te fez ir e o que problemas você tem encontrado?

Sobre o autor: Este artigo, bem como outros 363 artigos no bloco de código.NET, escrito por Raphael. -Desde 2011 blog aqui sobre programação, meu software, escrever tutoriais e tentar o meu conhecimento, portanto ele vai bem, para compartilhar com meus leitores. Além disso, escrevo sobre temas de meus estudos sobre derwirtschaftsinformatiker.de. E-mail • Google + • Facebook • Twitter


1SHARESFacebookTwitterGoogleWhatsappRedditPocketStumbleuponPinterestXingMail