在开发微信公众平台平台的过程中,有这么几个参数总是需要传来传去,$userOpenId,$message,$time。

  在整个程序的运行过程中,为了函数方便的处理,将这三个变量一直放在参数列表里。关于这点,我突然联想到在Android里面,总是有一个Context(上下文)对象传来传去的,现在我的理解是,Context里面存放了一些必要的数据,在整个程序执行的逻辑中都有可能被使用。

  因此,我就思考了一下,我这个三个变量要不要包装成Context呢?性能上会不会有提升?

  PHP的函数参数如果是变量的话,都是直接传变量的拷贝,如果是传对象的话,是传对象的指针。也就是说,如果定义了一个String,放到一个函数里去修改,如果不以返回值的形式返回的话,该变量没有被修改,被修改的是该变量的一个拷贝。如果是定义一个对象放到函数中去操作,修改的直接就是这个对象本身。

  由上面的思考,我认为如果传对象的话,可能会更快一点(因为不需要复制)。于是,我写了如下代码来测试。

<?php

//程序开始
$time1 = microtime(); //上下文环境的三个变量
$userOpenId = "abcdefghijk";
$message = "我想要查询什么";
$time = time(); //构建上下文对象
$context = new Context($userOpenId, $message, $time); //循环次数
$timeOfLoop = 5000; for ($i = 1; $i <= $timeOfLoop; $i++) {
//handleMessageByParams($userOpenId, $message, $time);
handleMessageByObject($context);
} //程序结束
$time2 = microtime(); //耗时
echo "cast:".($time2 - $time1); //通过传参数的处理方法
function handleMessageByParams($userOpenId, $message, $time) {
echo "working......[".$userOpenId.$message.$time."]\n";
//100 0.00020699999999996
//1000 0.002683
//5000 0.011099
} //通过传对象的处理方法
function handleMessageByObject($context) {
echo "working......[".$context->userOpenId.$context->message.$context->time."]\n";
//100 0.00024099999999999
//1000 0.002897
//5000 0.014896
} //上下文对象
class Context { public $userOpenId = null;
public $message = null;
public $time = null; public function __construct($userOpenId, $message, $time) {
$this->userOpenId = $userOpenId;
$this->message = $message;
$this->time = $time;
}
}
?>

  测试的结果我已经在注释中写出,单位是ms(毫秒)。可见,传Context反而变慢了一点。当然,考虑到这个上下文的环境也不可能在一次代码中传来传去传5000次,而且性能差异也是非常小的毫秒级,所以,使用上下文对象来传递必须的参数是一个更优雅的选择。

PHP关于传众多参数还是传上下文对象的性能测试的更多相关文章

  1. (63)Wangdao.com第十天_预处理、预解析_函数 上下文对象、参数列表对象

    预解析.预处理 1. 在全局代码执行之前,js 引擎 就会创建一个栈来存储管理所有的 执行上下文对象 2. 在 全局执行上下文 window 确定以后,进行压栈 3. 在 函数执行上下文对象 确定以后 ...

  2. Context上下文对象(抄书的)

    Servlet上下文 ServletContext 上下文接口    ServletContext接口    每一个应用都有唯一的一个上下文对象,即为ServletContext对象    Servl ...

  3. 从js向Action传中文参数出现乱码问题的解决方法

    Action获取jsp表单中的中文参数,只要整个项目都采用UTF-8编码格式都不会出现乱码问题:但JSP中用到JS,并从JS向Action传中文参数,就会出现中文乱的现象     做项目的时候,发现A ...

  4. (转) jsp页面 URL传中文参数到Action里面出现乱码

    jsp页面 URL传中文参数到Action里面出现乱码,方法如下: 第一种:在Action中用 new String(str.getBytes("ISO8859_1"), &quo ...

  5. 百度上传工具webuploader,图片上传附加参数

    项目中需要上传视频,图片等资源.最先做的是上传图片,开始在网上找了一款野鸡插件,可以实现图片上传预览(无需传到后台).但是最近这个插件出了莫名的问题,不易修复,一怒之下,还是决定找个大点的,靠谱的插件 ...

  6. 论httpclient上传带参数【commons-httpclient和apache httpclient区别】

    需要做一个httpclient上传,然后啪啪啪网上找资料 1.首先以前系统中用到的了commons-httpclient上传,找了资料后一顿乱改,然后测试 PostMethod filePost = ...

  7. IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0

    JavaScript中数字有十进制.八进制.十六进制.以"0"开头的是八进制,"0x"或"0X"开头的是十六进制. parseInt用来把字 ...

  8. C语言 数组做函数参数不传数组个数的遍历方法

    //数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...

  9. MyBatis查询传一个参数时报错:There is no getter for property named 'sleevetype' in 'class java.lang.Integer

    用MyBatis进行查询,传入参数只有一个时(非Map)如int,报错 There is no getter for property named 'sleevetype' in 'class jav ...

随机推荐

  1. 20155313 2016-2017-2 《Java程序设计》第二周学习总结

    20155313 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 1.1 基本类型 整数:可细分为short整数(占2字节).int整数(占4字节)与long ...

  2. 20155334 2016-2017-2《Java程序设计》课程总结

    20155334 2016-2017-2<Java程序设计>课程总结 1. 每周作业链接汇总 题目 主要内容 二维码 预备作业1 不知道所以然的第一次博客 预备作业2 有关之前的C语言的调 ...

  3. 一个奇怪的JS函数

    今天在分析一个jQuery插件源码的时候,发现了一个奇怪的函数. 这个函数的目的是为数字补零,如传入7,输出07,传入12输出12.由于是对时间补零,只截取后两位. // add leading ze ...

  4. Swing 解决 idea 找不到创建gui form的问题

    果然,寄希望于百度google不如自己动手,还是得吃透文档, 然后就是对于别人的博客要严格对照步骤来,否则都容易达不到效果 这边gui form在idea下找不到创建,百度google一个说的也没有, ...

  5. 《Flutter实战》开源电子书

    <Flutter实战>开源电子书 <Flutter实战> 开源了,本书为 Flutter中文网开源电子书项目,本书系统介绍了Flutter技术的各个方面,本书属于原创书籍(并非 ...

  6. asp.net core 2.2 根据PC端和移动端自动显示不同视图而不改变url地址

    1.添加HttpRequest扩展方法 public static class RequestExtensions { //regex from http://detectmobilebrowsers ...

  7. win7升级到win10,出现算术运算溢出问题

    前台winform,后台java代码是: OutputStream ou=(OutputStream)response.getOutputStream(); ou.write(rightSet.get ...

  8. 函数parseQuery用于解析url查询参数

    在百度上找的,以后忘了再看. 语法如下: var obj = parseQuery(query) query是被解析的查询参数,函数返回解析后的对象. 使用范例如下: var jerry = pars ...

  9. UGUI简易摇杆

    实现 直接使用系统自带圆形控件图标 编写脚本, 实现UGUI拖拽事件 将多拽范围限定于给定半径和圆心的圆内 计算出等同于Input.GetAxis()的值,直接控制被控制物体 代码 using Sys ...

  10. Unity Lighting - Light Types 灯光类型(八)

      Light Types 灯光类型 We have now covered some of the project settings which need to be considered befo ...