Home > Article > Backend Development > PHP performance test on whether to pass multiple parameters or context objects_PHP tutorial
In the process of developing the WeChat public platform, there are several parameters that always need to be passed around, $userOpenId, $message, $time.
During the entire running process of the program, these three variables are always placed in the parameter list for the convenience of function processing. Regarding this point, I suddenly thought that in Android, there is always a Context object passed around. Now my understanding is that some necessary data is stored in the Context, which is used in the logic of the entire program execution. may be used.
Therefore, I thought about it, should my three variables be packaged into Context? Will there be any improvement in performance?
If PHP’s function parameters are variables, they are passed directly to the copy of the variable. If they are passed to objects, they are passed to the pointers of the objects. In other words, if a String is defined and modified in a function, if it is not returned in the form of a return value, the variable has not been modified, but a copy of the variable has been modified. If you define an object and put it into a function for operation, the object itself will be modified directly.
Based on the above thinking, I think it might be faster if the object is passed (because there is no need to copy). So, I wrote the following code to test.
<?<span php </span><span //</span><span 程序开始</span> <span $time1</span> = <span microtime</span><span (); </span><span //</span><span 上下文环境的三个变量</span> <span $userOpenId</span> = "abcdefghijk"<span ; </span><span $message</span> = "我想要查询什么"<span ; </span><span $time</span> = <span time</span><span (); </span><span //</span><span 构建上下文对象</span> <span $context</span> = <span new</span> Context(<span $userOpenId</span>, <span $message</span>, <span $time</span><span ); </span><span //</span><span 循环次数</span> <span $timeOfLoop</span> = 5000<span ; </span><span for</span> (<span $i</span> = 1; <span $i</span> <= <span $timeOfLoop</span>; <span $i</span>++<span ) { </span><span //</span><span handleMessageByParams($userOpenId, $message, $time);</span> handleMessageByObject(<span $context</span><span ); } </span><span //</span><span 程序结束</span> <span $time2</span> = <span microtime</span><span (); </span><span //</span><span 耗时</span> <span echo</span> "cast:".(<span $time2</span> - <span $time1</span><span ); </span><span //</span><span 通过传参数的处理方法</span> <span function</span> handleMessageByParams(<span $userOpenId</span>, <span $message</span>, <span $time</span><span ) { </span><span echo</span> "working......[".<span $userOpenId</span>.<span $message</span>.<span $time</span>."]\n"<span ; </span><span //</span><span 100 0.00020699999999996 //1000 0.002683 //5000 0.011099</span> <span } </span><span //</span><span 通过传对象的处理方法</span> <span function</span> handleMessageByObject(<span $context</span><span ) { </span><span echo</span> "working......[".<span $context</span>->userOpenId.<span $context</span>->message.<span $context</span>-><span time</span>."]\n"<span ; </span><span //</span><span 100 0.00024099999999999 //1000 0.002897 //5000 0.014896</span> <span } </span><span //</span><span 上下文对象</span> <span class</span><span Context { </span><span public</span> <span $userOpenId</span> = <span null</span><span ; </span><span public</span> <span $message</span> = <span null</span><span ; </span><span public</span> <span $time</span> = <span null</span><span ; </span><span public</span> <span function</span> __construct(<span $userOpenId</span>, <span $message</span>, <span $time</span><span ) { </span><span $this</span>->userOpenId = <span $userOpenId</span><span ; </span><span $this</span>->message = <span $message</span><span ; </span><span $this</span>-><span time</span> = <span $time</span><span ; } } </span>?>
I have written the test results in the comments, the unit is ms (milliseconds). It can be seen that transferring Context is a bit slower. Of course, considering that the environment of this context cannot be passed back and forth 5,000 times in one code, and the performance difference is very small in milliseconds, using the context object to pass the necessary parameters is a more elegant choice.