分类 PHP 下的文章

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次循环呐!更何况是一个七维数组呢~

解决phpMyAdmin点击"结构"列页面失去响应的问题

最后更新时间 2017-12-05.

我的环境:

phpMyAdmin:4.0.4.1

PHP:5.6.11

第一步 关闭自动更新

打开 ./libraries 目录下的 vendor_config.php,将 VERSION_CHECK_DEFAULT 的值设置为 FALSE, 意思是关闭自动更新。原因是官方无法访问。

define('VERSION_CHECK_DEFAULT', FALSE);

第二步 修正时间问题

打开 ./libraries 目录下的 Util.class.php,查找,

return strftime($date, $timestamp);

替换成下面的代码:

if (extension_loaded('gettext'))
{
    return strftime($date, $timestamp);
}

如果你在中国,使用北京时间,可以替换成下面的代码:

if (extension_loaded('gettext'))
{
    date_default_timezone_set('UTC');
    return gmdate('Y-m-d H:i:s', $timestamp + 28800);
}

至此,再刷新一下页面,点击“结构”等页面,页面的响应速度是不是大大提升了呢?嘿嘿,我的已经解决了,妈妈再也不用担心我又卡在“结构”页面啦!哈哈!最后感谢这篇文章指点迷津哦:

该链接已失效(2017-12-05).

http://www.fenanr.com/diy/112032.html