PHP递归和循环的速度测试

简介: 写了一个可以对 $_GET`, `$_POST 等输入进行过滤的函数,做了PHP递归和循环的速度测试。

本文于 2017-12-05 重新整理.

写了一个可以对 $_GET`, `$_POST 等输入进行过滤的函数,递归实现如下:

function array_map_recursive({
   mathJaxContainer[1]}data)
{
   
    $result = [];
    foreach ({
   mathJaxContainer[2]}filter)
    {
   
        foreach ({
   mathJaxContainer[3]}key => $value)
        {
   
            {
   mathJaxContainer[4]}key] = is_array($value) 
                ? array_map_recursive({
   mathJaxContainer[5]}value)
                : call_user_func({
   mathJaxContainer[6]}value);
        }
    }
    return $result;
}

后来想想,以前看书的时候经常说递归函数会浪费堆栈空间,甚至会导致堆栈溢出,于是重新用循环实现了这个函数:

function array_map_all({
   mathJaxContainer[7]}data)
{
   
    foreach ({
   mathJaxContainer[8]}filter)
    {
   
        $stack = [];
        {
   mathJaxContainer[9]}data;
        while ( ! empty($stack))
        {
   
            {
   mathJaxContainer[10]}stack[count($stack) - 1];

            array_pop($stack);

            if ( ! is_array($node))
            {
   
                {
   mathJaxContainer[11]}filter, $node);
            }
            else
            {
   
                foreach ({
   mathJaxContainer[12]}key => $value)
                {
   
                    if ( ! empty($value))
                    {
   
                        {
   mathJaxContainer[13]}node[$key];
                    }
                }
            }
        }
    }
    return $data;
}

写完哇擦~多了这么多行~还是递归简洁明了:)

速度如何呢?写个代码测试一下!

$filters = ['trim', 'htmlspecialchars'];
$data = [
    ' 5 &',
    [' 3 ', ' 7 '],
    [' 2 ', ' 4 '],
    ' 15 ',
    ' 4 ',
    ['12 ', '  ', ' 3 ', ' 4'],
];

$begin = microtime(true);
for ({
   mathJaxContainer[14]}i < 10000; $i++)
{
   
    array_map_recursive({
   mathJaxContainer[15]}data);
}
{
   mathJaxContainer[16]}begin;
echo '递归用时: '.sprintf('%.4f', $t1)."\n";

$begin = microtime(true);
for ({
   mathJaxContainer[17]}i < 10000; $i++)
{
   
    array_map_all({
   mathJaxContainer[18]}data);
}
{
   mathJaxContainer[19]}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/

目录
相关文章
|
2月前
|
Perl
在awk中,初始化-测试-递增型的 `for` 循环
在awk中,初始化-测试-递增型的 `for` 循环
17 2
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
2月前
|
PHP
从建站到拿站 -- PHP判断循环及函数
从建站到拿站 -- PHP判断循环及函数
12 0
|
4月前
|
算法 小程序 PHP
PHP实现递归排序
在leetcode练习算法的时候,发现一个算法需要用到递归。 递归是个好东西,但是吧,一般不理解其精髓的,很难写出一个好的递归。 递归其实就是函数本身直接或者间接地调用自身的一种编程方法(我自己调用我自己~),也可以理解为有反复执行过程的一种方法,这个就与循环非常相似,但是递归调用的函数中必须要有终止条件,也就是一定
28 1
|
6月前
|
PHP 数据库 索引
PHP中的for循环和forEach循环
PHP中的for循环和forEach循环
|
6月前
|
Shell Linux Go
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
69 0
|
7月前
|
PHP
PHP 循环的中断和中断层数的含义(continue、break)
PHP 循环的中断和中断层数的含义(continue、break)
41 0
|
8月前
|
PHP 数据库
对PHP源码的测试
对PHP源码的测试