php 使用生成器yield 感悟小结

今天需要统计log文件, 大概400m 突发奇想使用一下生成器, 

第一种使用生成器

代码如下 

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
$file='./server_2.log';
$startMemory = memory_get_usage();
function getContents($file){
    $fileContent=new SplFileObject($file);
    $count=0;
    while (!$fileContent->eof()){

        yield $fileContent->fgets();
        $count++;
    }
    return $count;
}
$start_time=microtime(true);//获取程序执行开始的时间
$res=getContents($file);
foreach ($res as $val){
    $s=$val;
}
echo  $res->getReturn().'<br>';
$end_time=microtime(true);//获取程序执行结束的时间
$elapse=$end_time-$start_time; //获取差值
$endMemory = memory_get_usage();
$useMemory = $endMemory-$startMemory;
echo "总共占用的内存大小为:".convert($useMemory)."</br>";
echo "第一种消耗时间".$elapse."</br>";  //此处设一个计时器 结束时间

  输出结果

    

 

 

 

第二种使用常规file()

$file_path = $file; //文件路径  此处找一个1094644行的TXT文件 test.txt
$startMemory = memory_get_usage();
set_time_limit(0);
$start_time=microtime(true);//获取程序执行开始的时间
$fileContent=file($file_path);
$num=0;
foreach ($fileContent as $val){
    $s=$val;
    $num++;
}
$line = count($fileContent);
//输出行数;
echo $num."</br>";
$end_time=microtime(true);//获取程序执行结束的时间
$elapse=$end_time-$start_time; //获取差值
$endMemory = memory_get_usage();
$useMemory = $endMemory-$startMemory;
echo "总共占用的内存大小为:".convert($useMemory)."</br>";
echo "第二种消耗时间".$elapse."</br>";  //此处设一个计时器 结束时间

输出结果 

     

 

 第三种  常规fopen()

//
$startMemory = memory_get_usage();
$file_path = $file; //文件路径  此处找一个1094644行的TXT文件 test.txt
$line = 0 ; //初始化行数
//打开文件
set_time_limit(0);
$start_time=microtime(true);//获取程序执行开始的时间
$fp = fopen($file_path , 'r') or die("open file failure!");
if($fp){
//获取文件的一行内容,注意:需要php5才支持该函数;
    while(stream_get_line($fp,8192,"\n")){
        $line++;
    }
    fclose($fp);//关闭文件
}
//输出行数;
echo $line."</br>";
$end_time=microtime(true);//获取程序执行结束的时间
$elapse=$end_time-$start_time; //获取差值
$endMemory = memory_get_usage();
$useMemory = $endMemory-$startMemory;
echo "总共占用的内存大小为:".convert($useMemory)."</br>";
echo "第三种消耗时间".$elapse."</br>";  //此处设一个计时器 结束时间

输出结果 

    

 

 一番操作下来,我发现生成器并没有多大优势 , 时间上更是拉胯, 这是一个389m的.log文件, file 最快最占内存, fopen 时间适中但是不占内存,  yield 时间和内存不占优势, 有点不明所以,难道它的优势不在读取内存吗? 此番测试下来, fopen倒是很惊喜, 内存和时间都在可接受范围内。决定项目暂时用fopen观察看看

posted @ 2021-07-20 14:42  飘柔2019  阅读(95)  评论(0编辑  收藏  举报