PHP函數調用及循環體內定義大型變量效率的研究

最近在用php作網站抓取,使用的是CURL。可是數據抓取的效率過低,分析了一下發現:網速問題最大的瓶頸,但這個我無能爲力;可是後來我發現,其實除了網速,提升代碼內部執行的效率也很重要。php

舉例說明吧,先來看看我最原始的代碼:html

 

<?phpmysql

$s=gettime();
$url="http://localhost/index.html";
for($i=1;$i<=10000;$i++){
        gethtml($url);   
}
$e=gettime();
echo $e-$s."\n";
function gethtml($url){
        $ch=curl_init($url);
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        $html=curl_exec($ch);
        curl_close($ch);
        return $html;
}
function gettime(){
        list($sec,$usec)=explode(" ",microtime());
        return $sec+$usec;
}
?>sql

爲了取消網速的影響,因此抓取的頁面改爲本地,index.html文件內空爲空。curl

上面代碼執行時間最短是3秒,最長的一次是30秒,不過整體來講仍是3秒的時候比較多。函數

後來我對代碼優化了一下,將curl的聲明放到了循環的外面,以下:優化

 

<?php網站

$s=gettime();
$url="http://localhost/index.html";
$ch=curl_init($url);
for($i=1;$i<=10000;$i++){
        gethtml($url,$ch);
}url

curl_close($ch);
$e=gettime();
echo $e-$s."\n";
function gethtml($url,$ch){
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        $html=curl_exec($ch);
        return $html;
}
function gettime(){
        list($sec,$usec)=explode(" ",microtime());
        return $sec+$usec;
}
?>htm

這樣修改之後,代碼的執行時間基本在1.5秒左右,相對於第一段代碼,效率提升了一倍。

爲了作個對比,說明是函數調用仍是循環內初始化curl浪費了時間,因此對上面代碼做了以下修改:

 

<?php

$s=gettime();
$url="http://localhost/index.html";
for($i=1;$i<=10000;$i++){
        $ch=curl_init($url);
        gethtml($url,$ch);
        curl_close($ch);
}
$e=gettime();
echo $e-$s."\n";
function gethtml($url,$ch){
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        $html=curl_exec($ch);
        return $html;
}
function gettime(){
        list($sec,$usec)=explode(" ",microtime());
        return $sec+$usec;
}
?>

上面代碼與第一段代碼效率沒有太大差異,最短爲3秒,最長我見過33秒,以3秒左右居多。

因而可知,在循環體內的函數調用並不會影響代碼的執行效率。

可是在循環內聲明變量、初始化變量,特別是初始化大型的變量/對象/資源(如curl,mysql等),會很大程序上影響代碼的執行效率。

相關文章
相關標籤/搜索