php中strtotime函数性能分析

2019-05-02 12:53:26于海丽

$__startT = microtime(TRUE);
for($i=0; $i<$allTime; $i += $gapTime){
  $count = 0;
  //用于数据比较的
  $startDT = date('Y-m-d H:i:s', $nowDayDT+$i);
  $endDT = date('Y-m-d H:i:s', $nowDayDT+$i+$gapTime);
  //用于显示的
  $xAxis1 = date('H:i', $nowDayDT+$i);
  $xAxis2 = date('H:i', $nowDayDT+$i+$gapTime);

  foreach($rawData as $line){
    $time = $line['log_dt'];
    if( $startDT<=$time && $time<$endDT ){
      $count ++;
    }
  }
  $resArr[] = [
    'date'=>$xAxis1.'~'.$xAxis2,
    'number'=>$count
  ];
}
echo microtime(TRUE)-$__startT;

遍历再优化

大家可能发现一个问题,for 里面嵌套一个 foreach,这性能有点担忧,其中里面的 foreach 有必要完全遍历吗?其实是不必的。只要查SQL数据的时候,按时间排序排出来。优化后的时间比较算法如下:

for{ ...
foreach($rawData as $line){
  $time = $line['log_dt'];//strtotime($line['log_dt']);
  //优化算法计算
  if($time<$startDT) continue;  //小于开始时间则跳过
  if($time>=$endDT) break;    //大于结束时间则结束
  $count ++;            //否则为符合条件
  //原始的算法
//  if( $startDT<=$time && $time<$endDT ){
//    $count ++;
//  }
}
...}

这里巧用了 continue 和 break 关键字,用于跳过一次循环和结束整个循环。这次的话,一天中刚开始的时间统计中,后面很大一部分数据的都可以直接跳过。最后总遍历时间缩短为约0.12秒 。

总结,在大型的数据处理中,应该尽量避免在遍历中进行数据的转换,避免用一些原理复杂的函数。如strtotime

相关文章 大家在看