← 回到文章

点号连接符与字符串内用使用变量的速度比较

一直喜欢在字符串内使用大括号包含变量,但是看到别人的程序中经常用点号连接。 难道这样快些? 于是对下面三种情况进行了测试: 1、 使用点号连接字符串和字符串变量。 2、 在字符串中使用大括号包含变量; 3、 在字符串中不使用大括号包含变量; 1、使用点号连接字符串和字符串变量

使用VLD查看结果如下:
Branch analysis from position: 12647312
Return found
filename:       D:\work\php\test.php
function name:  (null)
number of ops:  8
compiled vars:  !0 = $str, !1 = $str2
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  EXT_STMT
         1  ASSIGN                                                   !0, 'abcd'
   3     2  EXT_STMT
         3  CONCAT                                           ~1      !0, 'efg'
         4  ASSIGN                                                   !1, ~1
   4     5  EXT_STMT
         6  RETURN                                                   1
         7* ZEND_HANDLE_EXCEPTION

2、在字符串中使用大括号:

Branch analysis from position: 12647312
Return found
filename:       D:\work\php\test.php
function name:  (null)
number of ops:  10
compiled vars:  !0 = $str, !1 = $str2
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  EXT_STMT
         1  ASSIGN                                                   !0, 'abcd'
   3     2  EXT_STMT
         3  INIT_STRING                                      ~1
         4  ADD_VAR                                          ~1      ~1, !0
         5  ADD_STRING                                       ~1      ~1, 'efg'
         6  ASSIGN                                                   !1, ~1
   4     7  EXT_STMT
         8  RETURN                                                   1
         9* ZEND_HANDLE_EXCEPTION

3、在字符串中不使用大括号包含变量

Branch analysis from position: 12647312
Return found
filename:       D:\work\php\test.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $str, !1 = $str2, !2 = $strefg
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  EXT_STMT
         1  ASSIGN                                                   !0, 'abcd'
   3     2  EXT_STMT
         3  INIT_STRING                                      ~1
         4  ADD_VAR                                          ~1      ~1, !2
         5  ASSIGN                                                   !1, ~1
   4     6  EXT_STMT
         7  RETURN                                                   1
         8* ZEND_HANDLE_EXCEPTION

另外,对于这样的两条语句执行一百万次,其结果如下:
1、使用点号连接字符串和字符串变量:平均在0.6秒
2、在字符串中使用大括号包含变量:平均在1.75左右
3、在字符串中不使用大括号包含变量: 平均在1.7秒左右
明显第一种要一些,从VLD查看的结果中可以看出后面两种与第一种的实现方式完全不同,后面两种多了INIT_STRING和ADD_VAR的操作。
最后更新于 2009-09-21 14:07:07