zoukankan      html  css  js  c++  java
  • php优化

    2015年12月14日 21:20:29

    之前写过两篇文章:

    xdebug配置

    xdebug trace 结果分析

    第二篇里边有两个很耗时间和内存的线条: 

    第一个斜坡:

    从mysql里读取数据后, 用while循环调用$result->fetch_assoc()将数据存放到数组里

    这里的缺点是循环调用该函数, 如果数据量比较大的话,会有很多的函数调用(上下文切换),很浪费效率

    优化:

    php源码安装.configure时指定mysqlnd驱动,老版本php源码安装时需要指定mysql安装的相关几个地址

    确保这一项以后, 使用$result->fetch_all(MYSQLI_ASSOC) 一次性将result转换为关联数组

     1 //将结果集转换成数组返回
     2     //如果field不为空,则返回的数组以$field为键重新索引
     3     public function rstoarray(&$result, $field = '')
     4     {
     5         $arrRs = $result->fetch_all(MYSQLI_ASSOC); //该函数只能用于php的mysqlnd驱动
     6         $result->free();
     7         
     8         if ($field) {
     9             $arrResult = [];
    10             foreach ($arrRs as $v) {
    11                 $arrResult[$v[$field]] = $v;
    12             }
    13             return $arrResult;
    14         }
    15         
    16         return $arrRs;
    17     }

    图中有一个水平线,内存没有增加,但是耗费了很多时间

    那里的代码是一段排序操作,用到了php的usort(); 自定义排序,

    需要自己写一个排序用的回调函数, 这段效率特别低

    优化:

    [

    'a' => ['sort' => 123],

    'b' => ['sort' => 234]

    .....

    ]

    先遍历要排序的二维数组(如上边的那个), 生成一个一维数组, 键为二维数组的键,值为排序用的那个值:

    [

    'a' => 123,

    'b' => 234

    ]

    然后用php的排序函数: asort() 或者 arsort();对这个一维数组排序, 然后根据对应关系生成一个新的完整的数组, 这样会快很多

     1 //按照二维数组中的某个键进行排序
     2     public function mysort(&$arr, $key, $desc = '')
     3     {
     4         $tmp = array();
     5         foreach ($arr as $k=>$v) {
     6             $tmp[$k] = $v[$key];
     7         }
     8         
     9         if ($desc) {
    10             arsort($tmp);
    11         } else {
    12             asort($tmp);
    13         }
    14         
    15         $result = array();
    16         foreach ($tmp as $k => $v) {
    17             $result[$k] = $arr[$k];
    18         }
    19         
    20         return $result;
    21     }

    SummerPHP 框架

  • 相关阅读:
    hdu 1086 You can Solve a Geometry Problem too 求n条直线交点的个数
    2019 上半年 南昌网络赛
    第十章 存储过程和函数
    第九章 Mysql函数
    第八章 Mysql运算符
    第七章 插入、更新与删除数据
    第六章 查询数据
    第五章 触发器
    第四章 视图
    第三章 索引
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/5046670.html
Copyright © 2011-2022 走看看