so php 单引号快还是双引号快? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答术问题时复制粘贴 AI 生成的内容
xiasix
V2EX    程序员

so php 单引号快还是双引号快?

  •  
  • xiasix 2013-09-28 12:56:56 +08:00 5141 次点击
  • 这是一个创建于 4398 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://www.metamorphosite.com/php-benchmarks-loops-arrays
    单纯的字符串的时候 他说是双引号快点
    so 自己写了个测了一下,php5.5 mac系统 终端下运行
    <?php
    $t1 = microtime(true);
    $i = 1;

    while ($i < 1000000) {
    $text = 'das;lfkjasd;lfkjads;lfkjasdl;fkjasdgnafdgljadhsfl;kadsfmasdl;gjkasdfio;mads;klgads;lfgkjads;fkljagl;k';

    ++$i;
    }

    $t2 = microtime(true);
    echo (($t2 - $t1) * 1000) . 'ms' . PHP_EOL;
    $i = 1;
    while ($i < 1000000) {
    $text = "das;lfkjasd;lfkjads;lfkjasdl;fkjasdgnafdgljadhsfl;kadsfmasdl;gjkasdfio;mads;klgads;lfgkjads;fkljagl;k";

    ++$i;
    }

    $t3 = microtime(true);
    echo (($t3 - $t2) * 1000) . 'ms'.PHP_EOL;
    结果
    bogon:~ kele$ php www/1.php
    86.992979049683ms
    87.911128997803ms
    bogon:~ kele$ php www/1.php
    87.116956710815ms
    88.299036026001ms
    bogon:~ kele$ php www/1.php
    89.183807373047ms
    87.899208068848ms
    bogon:~ kele$ php www/1.php
    87.803840637207ms
    88.411092758179ms
    bogon:~ kele$ php www/1.php
    87.093114852905ms
    88.102102279663ms
    bogon:~ kele$ php www/1.php
    88.034868240356ms
    88.240146636963ms
    bogon:~ kele$ php www/1.php
    88.271856307983ms
    88.357210159302ms
    bogon:~ kele$ php www/1.php
    87.208032608032ms
    86.41791343689ms
    22 条回复    1970-01-01 08:00:00 +08:00
    pathletboy
        1
    pathletboy  
       2013-09-28 13:08:53 +08:00
    这种测试不准的,因为你的线程可能会被切换走,导致运行时间增加,特别是你这种时间越短越不准。
    shiny
        2
    shiny  
       2013-09-28 13:11:38 +08:00
    它也没说所有情况下单引号都快啊:
    Double quotes is 2.9% faster than Single quotes by an average of 0.00024834399999999s.
    Single quotes concatenation is 5.44% faster than Double quotes concatenation by an average of 0.0005676475789474s.

    不同的地方是双引号还要解析字符串吧。
    在我看来在 php 里比这种快慢是非常非常无聊的。
    skydiver
        3
    skydiver  
       2013-09-28 13:15:44 +08:00   1
    纠结这些细节没什么意义..来一个数据库IO,这些省出来的时间全不值一提。
    yakczh
        4
    yakczh  
       2013-09-28 13:26:19 +08:00
    php慢不是因为拼字符串,而是很多框架引用一大堆没用的类,引起的额外的io开销,每次请求都要调用stat都检查每个文件是不是有更新 ,导致单文件和框架会有70%的性能差距
    yakczh
        5
    yakczh  
       2013-09-28 13:29:08 +08:00
    累计百万的请求省出来1毫秒的优势,小伙伴们都惊呆了
    yangqi
        6
    yangqi  
       2013-09-28 13:53:16 +08:00
    都5年前的文章了, 别太当真了.

    不信你把上下两次比较都用同样的,单引号或者双引号. 最后结果也是不同的, 所以结果你明白的
    xiasix
        7
    xiasix  
    OP
       2013-09-28 13:53:28 +08:00
    @yakczh 测试,测试 你和你的小伙伴们懂么
    xiasix
        8
    xiasix  
    OP
       2013-09-28 13:55:38 +08:00
    @skydiver 只是想知道以后想代码申明字符串的时候 是 $a="nihao"; 还是$a='nihao'; 而已
    zhujinliang
        9
    zhujinliang  
       2013-09-28 14:15:29 +08:00
    双引号可以处理嵌入变量,拼字符串时会很便利
    用到这种特性时就写双引号,用不到时就写单引号
    msg7086
        10
    msg7086  
       2013-09-28 14:17:51 +08:00
    @xiasix 从语言源码角度来说,单引号是字符串立即量,双引号则会解析变量引用,所以单引号要比双引号快。
    实际则是两者速度非常接近,就算你把整个页面所有的单引号都改成双引号,对执行效率的影响还不及气温带来的速度变化。
    ejin
        11
    ejin  
       2013-09-28 15:01:31 +08:00
    100万次才这么点区别么……
    yxzblue
        12
    yxzblue  
       2013-09-28 15:51:03 +08:00
    看来,大伙讨论得够多了。我插句,按文档来吧
    yakczh
        13
    yakczh  
       2013-09-28 16:16:29 +08:00
    别搞这些hellowold式的测试了,测试下不同框架数据库两个表连接查询的性能对比才有实际意义
    taogogo
        14
    taogogo  
       2013-09-28 16:29:26 +08:00
    只能理论上来说,单引号快,其实是无所谓的,代码好看就好
    zhujinliang
        15
    zhujinliang  
       2013-09-28 16:36:43 +08:00
    @msg7086 这种解析不应该是编译期做的事么,理论上两种写法编译后应该是一样的,只是编译过程中处理方式不一样会有效率差别
    zouchao
        16
    zouchao  
       2013-09-28 16:46:58 +08:00
    这个时间的差异,觉得没有太大的意思!
    nine
        17
    nine  
       2013-09-28 17:13:00 +08:00
    <?php
    $t1 = microtime(true);
    $i = 1;

    while ($i < 1000000) {
    $text = 'das;lfkjasd;lfkjads;lfkjasdl;fkjasdgnafdgljadhsfl;kadsfmasdl;gjkasdfio;mads;klgads;lfgkjads;fkljagl;k';

    ++$i;
    }

    $t2 = microtime(true);
    echo (($t2 - $t1) * 1000) . 'ms' . PHP_EOL;
    $i = 1;
    while ($i < 1000000) {
    $text = "{$i}das;lfkjasd;lfkjads;lfkjasdl;fkjasdgnafdgljadhsfl;kadsfmasdl;gjkasdfio;mads;klgads;lfgkjads;fkljagl;k";

    ++$i;
    }

    $t3 = microtime(true);
    echo (($t3 - $t2) * 1000) . 'ms'.PHP_EOL;

    ?>


    给你改了一点点 LZ 运行这段代码试试
    xlmo
        18
    xlmo  
       2013-09-28 17:14:00 +08:00
    用双引号还是单引号除了功能区别外主要还是习惯上的区别。性能上的区别微乎其微,没有必要纠结在这上面。
    比如对于有变量的字符串我用双引号,没有变量的字符串我用单引号。
    zencoding
        19
    zencoding  
       2013-09-28 18:23:59 +08:00
    把单引号作为习惯即可,没必要吹毛求疵
    msg7086
        20
    msg7086  
       2013-09-29 02:09:20 +08:00
    @zhujinliang 好吧,的确有这个可能,内嵌变量可以在编译阶段重写成字符串拼接。
    DKR
        21
    DKR  
       2013-09-29 09:47:15 +08:00
    doublleft
        22
    doublleft  
       2013-10-01 00:12:04 +08:00
    优先使用单引号
    $var = 'hello' . 'myname' . 'is' . name(); //这样就会太尴尬了
    不如就
    $var = "hello, myname is : name() "; //多了然
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5979 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 55ms UTC 01:41 PVG 09:41 LAX 18:41 JFK 21:41
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86