资讯专栏INFORMATION COLUMN

关于php echo用逗号和用点号连接的区别?哪个更快?

neu / 1939人阅读

摘要:先上大神文章里面提到了字符串用比用连接要好。原因先不说,先来看以下两句逗号比更节省时间结果是什么我只能说的结果是,所以结果是和至于为啥快,可以简单理解,用是先拼接在,虽然逗号个数代表的调用次数可以这么理解暂时。但是拼接的速度要小于的速度。

先上大神文章54chen

里面提到了echo 字符串用,比用.连接要好。原因先不说,先来看以下两句

 

结果是什么?
1+5=6?
1+5=6?
——————
6?
2?
——————
6.6?
6.6?
——————
我只能说echo "5+1=" . 1+5;的结果是10,所以结果是62.

php echo manual


至于为啥快,可以简单理解,用.是先拼接在echo,虽然逗号个数代表echo的调用次数(可以这么理解暂时)。
但是拼接的速度要小于echo的速度。
如果深入理解,VLD如下图。是@tywei大神的图

上面比下面多了个CONCAT,下面比上面多了个echo。
如果想知道更多详细信息,点击查看这个重磅炸弹

=======更新分割线===================2016-05-27
今天在看java的时候,发现java的string对象很严谨,小例子如下

public class HelloWorld {
    public static void main(String[] args) {
        String s1 = "imooc";
        String s2 = "imooc";
        String s3="I love "+s1; 
        
        //定义字符串s3,保存“I love”和s1拼接后的内容
         
        
        // 比较字符串s1和s2
        // imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
        System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
        
        //比较字符串s1和s3
        System.out.println("s1和s3内存地址相同吗?" +    (s2==s3)             );

        String s4 = "I love " + s1;
         //比较字符串s4和s3
        // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
        System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
    }
}

以上的结果为
s1和s2内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
暂不讨论内存地址这个概念(其实我不大懂),我就想起了php中是不是也是这样。
类似例子就不贴了,php肯定是全等的。。但是我又想到了怎么看php中内存具体怎么调用,想到了c下的gdb。但是php还是解析不了。那先看看opcode,然后就有这篇补上的文章了。

我们先安装个vld扩展,先声明我环境为14.04 LTS PHP 5.5.9-1ubuntu4.16 (cli)
pecl下载vld

tar zxvf解压

进入到解压好目录

phpize 
./configure 
make && make install 

(注意操作要在root下,要不会报perssion错误)

root@tb:/home/tb/Downloads/vld-0.13.0# ls /usr/lib/php5/20121212/
json.so    memcached.so  mysql.so    pdo_mysql.so  readline.so  vld.so
mcrypt.so  mysqli.so     opcache.so  pdo.so        redis.so     xhprof.so

这样就装好了。

====修改fpm下的配置文件

vim /etc/php5/fpm/php.ini

增加一行vld的,如下所示

[redis]
extension =redis.so
[xhprof]
extension=xhprof.so
[vld]
extension=vld.so
xhprof.output_dir=/var/log/xhprof
[memcache]
extension =memcached.so

重启fpm

service php5-fpm stop
service php5-fpm start

可以看到web中的phpinfo有了vld的选项。

vld support    enabled

为啥说是web中呢,因为我们一般调试在cli端
所以需要修改下cliphp.ini文件

执行php -m |grep vld

root@tb:/usr/share/nginx/html/vldtest# php -m |grep vld
vld

就说明cli下的vld也可以用了。

然后我们在具体目录建两个php文件,内容如下

root@tb:/usr/share/nginx/html/vldtest# cat 1.php 

root@tb:/usr/share/nginx/html/vldtest# cat 2.php 

root@tb:/usr/share/nginx/html/vldtest# 

然后分别执行

php -dvld.active=1 1.php 

root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 1.php 
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /usr/share/nginx/html/vldtest/1.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   CONCAT                                           ~0      "hello", "+"
         1        CONCAT                                           ~1      ~0, "world"
         2        ECHO                                                     ~1
   3     3      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     3; out1:  -2
path #1: 0, 
hello world

php -dvld.active=1 2.php 

root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 2.php 
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /usr/share/nginx/html/vldtest/2.php
function name:  (null)
number of ops:  4
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ECHO                                                     "hello"
         1        ECHO                                                     "+"
         2        ECHO                                                     "world"
   3     3      > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     3; out1:  -2
path #1: 0, 
hello world

下面简单记录下参数意义:
-dvld.active 是否再执行时激活vld,默认为0.所以我们都使用-dvld.active=1启用
-dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件,默认为0,就是禁用。
就是不跳过
-dvld.execute 是否执行php脚本,默认为1,所以上面都显示了helloworld
-dvld.save_paths 指定是否输出文件
再膜拜下大神关于vld的文章

另外感兴趣的同学关于扩展可以执行下 php --re vld【redis,memcache】

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21457.html

相关文章

  • 正则表达式之量词

    摘要:点号正则中,有一个特殊的特殊的元字符,点号,它可以匹配任意字符,除了换行符。表各种量词的转义量词转义形式除此之外,元字符点也需要加反斜线来进行转义。   我们知道,在正则表达式中,可以使用[0-9]或d来匹配单个数字字符,但是,如果需要验证一个更复杂的字符串呢,比如大陆地区的邮政编码。  不过邮政编码并没有特别规定,只有由6个数字组成的字符串而已, 如246512,根据[0-9]或d,...

    lansheng228 评论0 收藏0
  • PHP工程师面试题+笔试题

    摘要:由于协议中没有定义任何状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送响应。表示要完成请求,需要进一步操作。 最近在广州找工作,大四狗,读着三本前两年刚升二本的学校,文科生,好像一切条件都非常不利,但我还是毅然选择这条路——拍黄片,人不能固步自封,还是要拓展一下自己的知识面,不能只学php而不拓展视野,还是要学学python、java、前端这些面试得有点心塞,各种因为学历被...

    v1 评论0 收藏0
  • ajax概述

    摘要:换一台电脑就要重新安装。并且还需要适配不同的系统。提交大小几乎没有限制。即协议主要由请求和响应组成。相反则为同步按照程序的顺序,依次往下执行,必须等上一程序执行完成之后才能执行下一程序,阻碍程序的执行。 Ajax 服务器 类型 按照服务类型:文件服务器,数据库服务器,邮件服务器,Web服务器 按照操作系统:Linux服务器,Windows服务器 按照应用软件:Apache服务器,Ng...

    Achilles 评论0 收藏0
  • Javascript数组索引不完全解析

    摘要:数组的大小是不固定的,可以像这样随意添加。再看一张图,这次多添加几个元素,再给数组添加一个属性注意看右侧对象的元素索引不知道你有没有发现。数组范围和索引转换那里是参考的,其他地方都是自己的理解和看法。 从题目说起,之所以是不完全,是因为有些东西比如数组的方法怎么用这个我都不打算讲,因为那个看一下都会,下面讲的都是我觉得重要的,只关于数组对象本身。另外,由于我的Javascript实战经...

    levius 评论0 收藏0
  • php 程序员 命令行指南 持续总结更新 mac

    摘要:直接强制结束程序。在用挂起程序时,当想要结束这个程序,最好用。能够模拟在控制台结束程序的功能。 向 host 文件快速添加新网址配置 echo 127.0.0.1 your.domian.com | sudo tee -a /etc/hosts NGINX 配置 #nginx禁止访问.点号开头的文件 location ~* /.* { deny all; } #nginx 禁止访问.s...

    gyl_coder 评论0 收藏0

发表评论

0条评论

neu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<