实验是我学习计算机科学的一个重要方法,计算机科学不是简单的智力游戏,它本质上来说不是一门科学,而是一个改造世界的工具。数学方法和实验方法是计算机研究的基本方法,也是我们学习的基本方法,数学锻炼我们的思维能力,实验锻炼我们的操作能力,解决实际问题的能力。我们每天的工作都应该看做是一次实验,要从每天的工作中,总结出对我们来说有用的东西。比如要写好php代码,一个很重要的东西就是效率,效率高不高,我们就要做实验。下面是我对php中的几个数组循环处理方法的评测,测试的代码很简单:

php

/*

*

* array_walk 和 foreach, for 的效率的比较。

* 我们要测试的是foreach, for, 和 array_walk的效率的问题。

*/

//

产生一个10000的一个数组。

$max

=

10000

;

$test_arr

=

range

(

0

,

$max

);

$temp

;

//

我们分别用三种方法测试求这些数加上1的值的时间。

// for 的方法

$t1

=

microtime

(

true

);

for

(

$i

=

0

;

$i

<

$max

;

$i

++

) {

$temp

=

$temp

+

1

;

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

就使用for, 没有对数组操作 花费: {

$t

}/n

"

;

$t1

=

microtime

(

true

);

for

(

$i

=

0

;

$i

<

$max

;

$i

++

) {

$test_arr

[

$i

]

=

$test_arr

[

$i

]

+

1

;

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用for 并且直接对数组进行了操作 花费: {

$t

}/n

"

;

$t1

=

microtime

(

true

);

for

(

$i

=

0

;

$i

<

$max

;

$i

++

) {

addOne(

$test_arr

[

$i

]);

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用for 调用函数对数组操作 花费 : {

$t

}/n

"

;

$t1

=

microtime

(

true

);

foreach

(

$test_arr

as

$k

=>

&

$v

) {

$temp

=

$temp

+

1

;

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用 foreach 没有对数组操作 花费 : {

$t

}/n

"

;

$t1

=

microtime

(

true

);

foreach

(

$test_arr

as

$k

=>

&

$v

) {

$v

=

$v

+

1

;

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用 foreach 直接对数组操作 : {

$t

}/n

"

;

$t1

=

microtime

(

true

);

foreach

(

$test_arr

as

$k

=>

&

$v

) {

addOne(

$v

);

}

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用 foreach 调用函数对数组操作 : {

$t

}/n

"

;

$t1

=

microtime

(

true

);

array_walk

(

$test_arr

,

'

addOne

'

);

$t2

=

microtime

(

true

);

$t

=

$t2

-

$t1

;

echo

"

使用 array_walk 花费 : {

$t

}/n

"

;

function

addOne(

&

$item

) {

$item

=

$item

+

1

;

}

?>

执行的结果:

就使用for, 没有对数组操作 花费: 0.15388584136963使用 foreach 没有对数组操作 花费 : 0.076934814453125使用for 并且直接对数组进行了操作 花费: 0.14769005775452

使用 foreach 直接对数组操作 : 0.076115131378174

使用for 调用函数对数组操作 花费 : 0.32393312454224

使用 foreach 调用函数对数组操作 : 0.25716996192932

使用 array_walk 花费 : 0.17966890335083

在对10000个数的操作过程中,这个实验我们可以得出这样的结论:

foreach 的效率要比for 高很多,也许有很大的一个原因是for 要进行很多次条件判断。所以以后能用foreach的地方就用foreach,可以提高1倍的效率。

如果循环内要调用函数,用array_walk  最好,它的效率要比for 高出1倍,要比foreach高出43%的效率。

还有一个提示就是如果你这个程序对效率的要求是很高的,那不要在很深的循环中调用函数,要调用函数也要用array_walk,最好的直接把代码写在循环里面。

再自己加点:

foreach是最快的,因为php的array内部元素之间有指针,就是list,直接指向下个元素的内存地址,所以遍历速度很快 for的问题在于,每次都要做一个hash table的查询。 array_walk/array_map 遍历的方式和foreach一样的,慢是慢在回调函数

php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...相关推荐

  1. php代码优化 -- array_walk 和 foreach, for 的效率的比较

    <?php /*** array_walk 和 foreach, for 的效率的比较.* 我们要测试的是foreach, for, 和 array_walk的效率的问题. *///产生一个10 ...

  2. 短信开发系列(二):GSM手机短信开发之短信解码

    短信开发系列目录: 短信开发系列(一):GSM手机短信开发初探 短信开发系列(二):GSM手机短信开发之短信解码 短信开发系列(三):短信接收引擎 昨天写了短信的发送,今天我们在来谈谈如果读取SIM卡 ...

  3. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

  4. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  5. PyTorch系列 (二): pytorch数据读取自制数据集并

    PyTorch系列 (二): pytorch数据读取 PyTorch 1: How to use data in pytorch Posted by WangW on February 1, 2019 ...

  6. SAP License:雾里看花系列——合理的机制才能让系统效率最大

    "SAP权限管理"小伙伴你们好.又是几天没见,很是想念你们,2021年已过半年,最近一直忙着计划和预算的事情,总算是忙完了.结果还要设计出绩效责任书便于对各个部门的考核,不过还好总 ...

  7. Quantopian 入门系列二 - 流水线 (下)

    本文含 8225 字,28 图表截屏 建议阅读 42 分钟 本贴接着上贴[Quantopian 入门系列二 - 流水线 (上)]的内容,讨论下面目录的 5- 8 节: 简介 因子 筛选器 分类器 掩码 ...

  8. 进入BeOS的花花世界 系列二

    进入BeOS的花花世界 系列二      BeOS 完全瞄准多媒体            ⊙记者张子强/专题报导             时间回到西元一九九O,苹果电脑Macintosh 麦金塔刚满六 ...

  9. 阵列信号DOA估计系列(二).导向矢量与空间FFT(附代码)

    阵列信号DOA估计系列(二).导向矢量 在DOA估计里面,经常会看到导向矢量这个名词,也有的地方叫方向矢量,方向矩阵,基本上都是array steering vector 的翻译. 本文首先对均匀线阵 ...

最新文章

  1. 《windows核心编程系列》二谈谈ANSI和Unicode字符集
  2. 3dsMax插件V-Ray渲染与合成学习课程 3ds Max: Rendering for Compositing in V-Ray Next
  3. jboss5+EJB3+MDB Queue
  4. 放弃安卓原生TimePicker,选择wheelView打造更漂亮的时间get,以及动态拉伸输入框布局,这些,这里都有!...
  5. boost::ignore_unused的用法实例
  6. 组织在召唤:如何免费获取一个js.org的二级域名
  7. OpenCV学习(二十) :分水岭算法:watershed()
  8. java验证cron表达式_cron表达式
  9. SR-IOV(Single Root I/O Virtualization):将PCIe共享给虚拟机的标准
  10. 算法竞赛从入门到进阶pdf_【算法趣谈】线段树 从入门到进阶
  11. 算法:链表实现插入排序Insertion Sort List
  12. OPC 通讯 Demo
  13. 【MySQL】MySQL中的死锁
  14. jQuery的$.ajax()与php后台交互,进行文件上传并保存在指定目录
  15. KEGG 通路信息下载及其相关处理
  16. 微信小程序校园介绍板
  17. ASP.NET4.0尚未在Web服务器上注册
  18. 在hb中html怎么插图片,WKWebView加载HTML文本(图片自适应)
  19. 团体程序设计天梯赛--个人总结
  20. 元胞自动机——应用于森林火灾和传染病场景

热门文章

  1. 【Python 04】Python开发环境概述
  2. 前台js获取url传递参数(后台Request.QueryString接收)
  3. Powershell创建数组
  4. [心跳] 互联网推送服务原理:长连接+心跳机制
  5. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(1)
  6. Google 的论坛
  7. Spring cloud学习总结
  8. Django+Scrapy结合使用并爬取数据入库
  9. Java 初始化块
  10. CAD数据与ArcGIS数据的互转换