文档章节

PHP函数调用及循环体内定义大型变量效率的研究

苗雨顺
 苗雨顺
发布于 2011/01/27 10:41
字数 552
阅读 447
收藏 1

最近在用php做网站抓取,使用的是CURL。但是数据抓取的效率太低,分析了一下发现:网速问题最大的瓶颈,但这个我无能为力;但是后来我发现,其实除了网速,提高代码内部执行的效率也很重要。

举例说明吧,先来看看我最原始的代码:

 

<?php

$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;
}
?>

为了取消网速的影响,所以抓取的页面改成本地,index.html文件内空为空。

上面代码执行时间最短是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);
}

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;
}
?>

这样修改以后,代码的执行时间基本在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等),会很大程序上影响代码的执行效率。

© 著作权归作者所有

苗雨顺
粉丝 15
博文 31
码字总数 12536
作品 0
东城
程序员
私信 提问
加载中

评论(0)

C和PHP中while和for效率的一点研究

在网上看到很多关于while和for循环效率的讨论,有说一样没区别的,也有说这个快或者另一个更快的。 看了很多也没有一个比较一致的结论,个人觉得这种东西没个绝对,for和while都有各自的优缺...

苗雨顺
2011/04/28
1.6K
5
iOS之Block-终结篇

前言 小时候家长和老师都教导我们,做人要善良要懂得吃亏.长大以后,才知道这样真的不好,有的时候你越是忍让越是糟糕,难受的是自己,有一句话说的很好:草木有本心,何须美人折? 活出自己最重要!...

有毒的程序猿
2017/03/02
0
0
淡淡简单描述javascript中方法apply和call

jquery博客最近在看原生javascript,是那本犀牛书,厚厚一本。 慢慢有条不絮的进行的学习。 看到apply()和call()不得不停留下来,仔细琢磨琢磨。 留点字迹,方便以后温习。 ECMAScript规范给...

天外飘雪
2012/09/18
59
0
『Go 语言学习专栏』-- 第七期

大家好,我叫谢伟,是一名程序员。 我们已经研究了: Golang 环境的搭建、设置GOPATH、GOROOT 参数,Govendor 包管理, Goland 集成开发环境 Golang 语言学习专栏 -- 第一期 Golang 的基础知...

谢小路
2018/05/14
0
0
Linux 内核 SCTP 协议漏洞分析与复现 (CVE-2019-8956)

作者:启明星辰ADLab 公众号:https://mp.weixin.qq.com/s/enoWQh1yo0Qjzck3ZzwidA 一、 漏洞背景 Linux 内核 SCTP 协议实现中存在一个安全漏洞 CVE-2019-8956(CNVD-2019-06182、CNNVD-201...

2019/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0228 我的潘多拉

我的潘多拉 从一个故事说起。<br />从前,有个Java程序员非常喜欢写程序,喜欢研究源码,读英文文档。但是它在一家小公司里工作,公司的技术栈很陈旧。<br /> <br />单个系统代码中含有很多的...

李福春carter
43分钟前
18
0
OSChina 周六乱弹 —— 屁会不会传染病毒

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《ハレハレヤ(朗朗晴天)》- 猫瑾 手机党少年们想听歌,请使劲儿戳(这里) @空格...

小小编辑
56分钟前
53
1
两个值得注意的问题

对成员变量的操作只能放在方法中,方法可以对成员变量和方法体中自己定义的局部 变量进行操作.在定义类的成员变量时可以同时赋予初值,如 class A { int a=12; float b=12.56f; } 但是不可以这...

咔啡
今天
27
0
第三章 分布式服务框架的选择

1.大项目工程且多人维护的弊端 (1)项目团队协同成本高,业务响应越来越慢 (2)应用复杂度已超出人的认知负载(向杂乱的电线一样) (3)错误难于隔离(一个模块出错,整个系统挂掉) (4...

zxx901221
今天
68
0
eclipse 上传jar到远程仓库

使用maven的项目中,有时需要把本地的项目打成jar包上传到mevan仓库。 操作如下: 前提:pom文件中配置好远程库的地址,否则会报错 一、将maven 中的settings文件配置好用户名和密码,如下:...

文文1
昨天
63
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部