PHP递归和循环的速度测试
本文于 2017-12-05 重新整理.
写了一个可以对 $_GET, $_POST 等输入进行过滤的函数,递归实现如下:
function array_map_recursive($filters, $data)
{
$result = [];
foreach ($filters as $filter)
{
foreach ($data as $key => $value)
{
$result[$key] = is_array($value)
? array_map_recursive($filters, $value)
: call_user_func($filter, $value);
}
}
return $result;
}
后来想想,以前看书的时候经常说递归函数会浪费堆栈空间,甚至会导致堆栈溢出,于是重新用循环实现了这个函数:
function array_map_all($filters, $data)
{
foreach ($filters as $filter)
{
$stack = [];
$stack[] = &$data;
while ( ! empty($stack))
{
$node = &$stack[count($stack) - 1];
array_pop($stack);
if ( ! is_array($node))
{
$node = call_user_func($filter, $node);
}
else
{
foreach ($node as $key => $value)
{
if ( ! empty($value))
{
$stack[] = &$node[$key];
}
}
}
}
}
return $data;
}
写完哇擦多了这么多行还是递归简洁明了:)
速度如何呢?写个代码测试一下!
$filters = ['trim', 'htmlspecialchars'];
$data = [
' 5 &',
[' 3 ', ' 7 '],
[' 2 ', ' 4 '],
' 15 ',
' 4 ',
['12 ', ' ', ' 3 ', ' 4'],
];
$begin = microtime(true);
for ($i = 0; $i < 10000; $i++)
{
array_map_recursive($filters, $data);
}
$t1 = microtime(true) - $begin;
echo '递归用时: '.sprintf('%.4f', $t1)."\n";
$begin = microtime(true);
for ($i = 0; $i < 10000; $i++)
{
array_map_all($filters, $data);
}
$t2 = microtime(true) - $begin;
echo '循环用时: '.sprintf('%.4f', $t2)."\n";
运行结果:
递归用时: 0.4985
循环用时: 0.5489
换个复杂的七维数组,如下:
$data = [
' 5 &',
[' 3 ', ' 7 ', [' 55 ', [' 565 ', [' 5445 ', ['da ', [', d '], '3']], 'd d']]],
[' 2 ', ' 4 '],
' 15 ',
' 4 ',
['12 ', ' ', ' 3 ', ' 4'],
];
运行结果:
递归用时: 5.7484
循环用时: 0.9799
嘿嘿结果不用我说了吧!还是循环好一些,不过实际应用中,是感觉不到太大差别的,毕竟是10000次循环呐!更何况是一个七维数组呢
文章来源于本人博客,发布于 2015-07-05,原文链接:https://imlht.com/archives/56/
PHP递归和循环的速度测试的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- javascript递归、循环、迭代、遍历和枚举概念
javascript递归.循环.迭代.遍历和枚举概念 〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当 ...
- snprintf/strncpy/strlcpy速度测试
速度测试代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <un ...
- PHP二分查找(递归和循环)
二分查找可以通过递归和循环来实现, 思路如下: 将要查找的数和中间数进行比较, 如果相等,则表示找到,返回下标 如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等 ...
- iOS5系统API和5个开源库的JSON解析速度测试
iOS5系统API和5个开源库的JSON解析速度测试 iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果和工程代码附件. 我们选择的测试对 ...
- TF卡速度测试对比 Class数越高速度越快
存储卡(TF卡)是手机扩展存储的大杀器,让你多装n部学习资料,多装n个外语听力练习.除了装东西外,存储卡性能不佳也会影响手机的整体性能以及体验的.本文主要针对Android手机,我是懒人,但我讨厌懒人 ...
- Java中递归和循环的优劣
介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...
- 手机闪存速度测试工具,AndroBench
手机闪存速度测试工具,AndroBench
- VPS性能测试(3):磁盘IO读写速度、SSD硬盘速度测试
1.磁盘IO,即输入/输出(Input/Output),这是测试磁盘性能一个重要指标,一些便宜的VPS主机为了降低成本,以大量的低性能的硬盘来充当服务器,导致VPS主机因为IO差而拖了整个主机性能的后 ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
随机推荐
- 如何在现有项目中使用`Masa MiniApi`?
首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Cor ...
- 彻底搞懂Redis持久化机制,轻松应对工作面试
1. 为什么要持久化 Redis是基于内存存储的数据库,如果遇到服务重启或者崩溃,内存中的数据将会被清空.所以为了确保数据安全性和可靠性,我们需要将内存中的数据持久化到磁盘上. 持久化不仅可以防止由于 ...
- Java中的自动装箱与自动拆箱
前言 在Java中,基本数据类型与其对应的封装类之间可以进行自动转换,这种特性称为自动装箱(autoboxing)和自动拆箱(unboxing).自动装箱和自动拆箱使得我们在使用基本数据类型时更加方便 ...
- c# 异步进阶———— 自定义 taskschedule[三]
前言 我们知道我们的task async 和 await 是基于线程池进行调度的. 但是async 和 await 也就是使用了默认的task调度,让其在线程池中运行. 但是线程池是榨干机器性能为本质 ...
- iOS APP启动广告实现方式 与 APP唤端调用
APP启动广告功能实现要从2个方面思考 一是UI方案,怎样处理广告页与主页之间的切换方式. 二是广告页展示时机,是使用后台实时广告数据还是使用本地缓存广告数据.后台数据方式获取广告最新但是用户要等待后 ...
- 加速 AI 训练,如何在云上实现灵活的弹性吞吐
AI 已经成为各行各业软件研发的基础,带来了前所未有的效率和创新.今天,我们将分享苏锐在AWS量化投研行业活动的演讲实录,为大家介绍JuiceFS 在 AI 量化投研领域的应用经验,也希望为其他正在云 ...
- .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记
Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...
- 2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag
2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}. packag ...
- 2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。 package main var n = -99 func main() { m := make(map[
2022-08-21:以下go语言代码输出什么?A:0:B:panic:C:不知道. package main var n = -99 func main() { m := make(map[stri ...
- 2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最多能挑选几个数。 来自美团。
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1. 返回你最多能挑选几个数. 来自美团. 答案 ...