域名|空间 淘宝 拍拍网店传奇世界私服 林海科技频道 欢迎加盟1G双线赠数据库八折广告位56296827
返回列表 回复 发帖

申精:对PHP采集数据提取核心函数的速度的测试与分析

  申精:对PHP采集数据提取核心函数的速度的测试与分析


From: http://www.h4cker.org/blog/index.php?action=show&id=39

By: ToToDoDo

对PHP采集数据提取核心函数的速度的测试与分析

由于程序需要,于是对PHP采集中的字符提取的核心部分进行了执行速度的测试。
测试了三种最常见的提取办法:

方法一:

CODE:
[url=###][Copy to clipboard][/url]
<?php

require "class.debug.php";

function getContent ( $sourceStr )
{
      $content = strstr( $sourceStr, &#39;形&#39; );
      $content = substr( $content, 0, strrpos( $content, &#39;言&#39; )  strlen( &#39;言&#39; ) );
               
      return $content;
}

$sourceStr = &#39;拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论&#39;;

$debug = new Debug;

$debug->startTimer();

for( $i = 0; $i < 1000000; $i  )
{
      $returnStr = getContent( $sourceStr );
}

$timeInfo = $debug->endTimer();

echo $timeInfo;

?>通过比较低级的字符操作函数进行提取.


方法二:

CODE:
[url=###][Copy to clipboard][/url]
<?php

require "class.debug.php";

function getContent ( $sourceStr )
{
      $pattern = "/形(.*?)言/is";
      preg_match_all( $pattern, $sourceStr, $result );
      return $result[1][0];
}

$sourceStr = &#39;拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论&#39;;

$debug = new Debug;

$debug->startTimer();

for( $i = 0; $i < 1000000; $i  )
{
      $returnStr = getContent( $sourceStr );
}

$timeInfo = $debug->endTimer();

echo $timeInfo;

?>使用一个简单的正则来提取.


方法三:

CODE:
[url=###][Copy to clipboard][/url]
<?php

require "class.debug.php";

function getContent ( $sourceStr )
{
      $content = explode( &#39;形&#39;, $sourceStr );
      $content = explode( &#39;言&#39;, $content[1] );

      return $content[0];
}

$sourceStr = &#39;拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论&#39;;

$debug = new Debug;

$debug->startTimer();

for( $i = 0; $i < 1000000; $i  )
{
      $returnStr = getContent( $sourceStr );
}

$timeInfo = $debug->endTimer();

echo $timeInfo;

?>通过两次explode分裂字符串来提取.


测试前我的观点是: 1 > 2 > 3

在两台电脑上进行测试,每台测试了两次,结果如下:


(1)17.32061
(2)26.81763
(3)17.53692

(1)17.87291
(2)26.88415
(3)17.10972

(1)11.30147
(2)20.25284
(3)11.54464

(1)11.69471
(2)21.19316
(3)11.72613

So,最终结果不是我想的那样,第一种和第三种方法的速度相当.第二种方法消耗时间大约是第一,三种的两倍.

看来正则由于匹配的原因速度是最慢的,而explode由于两次的分裂,虽然速度上不慢,但是资源消耗比第一种方法多,毕竟是分裂了两次,都是分裂到数组,开销比纯粹的简单字符函数处理要来得大.

经由缺氧的爱提醒,对更多的字符内容进行测试...测试了im286.com的首页:

CODE:
[url=###][Copy to clipboard][/url]
$sourceStr = implode (&#39;&#39;, file (&#39;files.html&#39;));(因为考虑到网络不够稳定,先把html文件保存到了本地)


最后的测试结果为:

(1)5.61648
(2)13.4523
(3)22.56853

分裂的效率是最低的...
综上,推荐使用方法一.

有兴趣的朋友可以自己测试下:

class.debug.php

CODE:
[url=###][Copy to clipboard][/url]
<?php

class Debug
{
   function startTimer()
   {
      global $starttime;
      $mtime = microtime ();
      $mtime = explode (&#39; &#39;, $mtime);
      $mtime = $mtime[1]  $mtime[0];
      $starttime = $mtime;
   }

   function endTimer()
   {
      global $starttime;
      $mtime = microtime ();
      $mtime = explode (&#39; &#39;, $mtime);
      $mtime = $mtime[1]  $mtime[0];
      $endtime = $mtime;
      $totaltime = round (($endtime - $starttime), 5);
      return $totaltime;
   }
}
?>如果您有更好的办法希望不吝赐教



[ Last edited by ToToDoDo on 2005-4-24 at 14:38 ]
返回列表