字体:  

为什么双引号反而会比单引号更快 ...?

Sunyanzi 发表于: 2008-8-18 00:22 来源: PHPChina 开源社区门户

我觉得双引号要涉及一个变量替换的过程 ...

单引号直接输出就是了 ...

但是测试的结果给了我狠狠一击 ...

具体可以参见 这个帖子 ...

代码结果如下 ...



每个时间都是单行执行的时间 ...

另外我刚才还测试了一个东西 ...

结果测试出了 print 的效率要比 echo 低 ...

echo 'a', 'b', 'c' 的效率要比 echo( 'a'.b'.c' ) 低 ...

是我走入了一个什么误区还是之前的传闻都是错的 ...?

最新回复

浪子夜 at 2008-8-18 00:56:04
你有从全局去考虑这个问题吗?
spiritxia at 2008-8-18 10:42:13
似乎只是一行程序谈不上效率吧
深空 at 2008-8-18 10:49:57
我怀疑你的时间执行函数的问题,要知道他每次执行的时间不是相同的。
leric at 2008-8-18 14:55:59
嗯,是有点儿诡异,双引号可是要做变量替换,转义的工作的啊
flash866 at 2008-8-18 15:31:03
建议你多测试几次,然后取平均值
mosee at 2008-8-18 15:33:36
孙燕姿果然与众不同
gincn at 2008-8-18 16:48:16
半夜三更的不睡觉 做这么无聊的事。
Sunyanzi at 2008-8-18 17:32:41
怀疑我的结果的人 ... 有没有自己去写一个程序试试看呢 ...?
Simonsen at 2008-8-18 18:56:09
以前有过这样的测试,结论和LZ的一样,所以我认为是没有什么好怀疑的。

这个也不知道怎么解释,但是让我想起另外一件事。
在命令行下面带参数“-r”可以直接将后面的参数视为php代码来执行。例如:

将会输出“3”

但是却下面两个语句在命令行中却可以得到不同的结果。

命令1可以得到正确的结果,命令2则报错,大意是输入了“意料外”的字符'(ASCII=39)。

也许php对单引号和双引号的处理跟我们大家想像的方式根本不一样……
linvo at 2008-8-18 19:03:00
这是我的测试



很明显,当替换时候的速度要明显慢于直接输出。
若同时输出固定字符串比较,两者没有明显差别。
Simonsen at 2008-8-18 19:20:08
很简单:你的测试代码涉及到了双引号的转义,单引号是不转义的,这就导致了测试对象的不对称。

下面是我的测试代码:


测试结果如下:
F:\f>php quote.php
single-quote run time: 0.047601938247681
double-quote run time: 0.043661117553711

F:\f>php quote.php
single-quote run time: 0.04463791847229
double-quote run time: 0.044512033462524

F:\f>php quote.php
single-quote run time: 0.044708967208862
double-quote run time: 0.044021844863892
fhjr999 at 2008-8-18 23:13:40
曾经做过测试,双引号确实要慢一些。
linvo at 2008-8-19 00:04:52
你认为我没注意到这一点吗?
我最后一句话不是已经说了“若同时输出固定字符串比较,两者没有明显差别。”
laruence at 2008-8-19 00:43:13
等我测试

[ 本帖最后由 laruence 于 2008-8-19 00:44 编辑 ]
laruence at 2008-8-19 00:50:37

CODE:

Branch analysis from position: 0
Return found
filename:       /home/xinchen/1.php
function name:  (null)
number of ops:  21
compiled vars:  !0 = $Sunyanzi
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  ASSIGN                                                   !0, 'here'
   4     1  ECHO                                                     'Sunyanzi+is+%24Sunyanzi'
   5     2  CONCAT                                           ~1      'Sunyanzi+is+', !0
         3  ECHO                                                     ~1
   6     4  INIT_STRING                                      ~2
         5  ADD_STRING                                       ~2      ~2, 'Sunyanzi+is+'
         6  ADD_VAR                                          ~2      ~2, !0
         7  ECHO                                                     ~2
   7     8  CONCAT                                           ~3      'Sunyanzi+is+', !0
         9  ECHO                                                     ~3
   9    10  ECHO                                                     'Sunyanzi+is+%22%24Sunyanzi%22'
  10    11  INIT_STRING                                      ~4
        12  ADD_STRING                                       ~4      ~4, 'Sunyanzi+is+%27'
        13  ADD_VAR                                          ~4      ~4, !0
        14  ADD_CHAR                                         ~4      ~4, 39
        15  ECHO                                                     ~4
  12    16  ECHO                                                     'Sunyanzi'
  13    17  ECHO                                                     'Sunyanzi'
  16    18  ECHO                                                     '%0A'
        19  RETURN                                                   1
        20* ZEND_HANDLE_EXCEPTION
在最终的opcods中,我们可以看到, 单引号字符串是直接输出,而双引号要经过contact,所以理论上来讲,一定是单引号的字符串处理起来快。

至于你的结果,或许和环境有关。。


具体关于opcodes, 可以去我的空间翻看我相关的文章
programmerhuang at 2008-8-19 08:00:31
其实我觉得这个快不是运行的快, 而是编译的快.
我没有研究过PHP里是怎么实现的, 但我猜是这样的:
双引号主要是编译时, PHP要去分析里面的变量.
"Sunyanzi is $Sunyanzi", 就是去分析里面$Sunyanzi, 最终可能会被转换成: 'Sunyanzi is ' . $Sunyanzi
而如果是直接写成'Sunyanzi is ' . $Sunyanzi, PHP就不用去分析, 转换了.
而上面的测试代码中, 无论循环多少次, PHP对代码的解释只有一次, 无法显示出效果.
chrisyue at 2008-8-19 08:41:20

QUOTE:

原帖由 Simonsen 于 2008-8-18 18:56 发表 [url=redirect.php?goto=findpost&pid=558279&ptid=75331][/url]
以前有过这样的测试,结论和LZ的一样,所以我认为是没有什么好怀疑的。

这个也不知道怎么解释,但是让我想起另外一件事。
在命令行下面带参数“-r”可以直接将后面的参数视为php代码来执行。例如:
php -r "ech ...
这里的单双引号不只是php的问题了,而是跟shell也有关系,php语句作为php.exe的参数传入到php程序中,参数如果没有空格连双引号都可以省略


[ 本帖最后由 chrisyue 于 2008-8-19 08:42 编辑 ]
chrisyue at 2008-8-19 08:43:55
另外php现在也能编译了?我记得php只能解释php scripts吧
E网逍遥 at 2008-8-19 10:04:44
LZ说的应该是正确的,我在一本书上(《PHP技术内幕》中国水利水电出版社)提到过(版本是php4),双引号是比单引号快,而echo也是比print快的。
不过语法要类似
$a = $value."value";
echo $a."value";
echo 不是函数,而print是函数,echo 不能用条件来判断,而print可以
if(print($a));
这只是人家提到过,我是没有真正测试过
flash866 at 2008-8-20 11:38:16
恩 不错 继续努力