仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2071|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之提拔PHP功能之改动Zend引擎分发体例

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-16 00:22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
PHP和HTML混合编程应该不成问题,在这期间,你完全可以让PHP给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。     
    从PHP5.1入手下手,PHP供应了用户对Zend VM履行分发体例的选择接口.
    之前的文章中, 我也提过这方面的内容, Zend虚拟机在履行的时分, 关于编译生成的op_array中的每条opline的opcode城市分发到响应的处置器(zend_vm_def.h界说)履行, 而依照分发的体例分歧, 分发进程可以分为CALL, SWITCH, 和GOTO三品种型.
    默许是CALL体例, 也就是一切的opcode处置器都界说为函数, 然后虚拟机挪用. 这类体例是传统的体例, 也普通被以为是最不乱的体例.
    SWITCH体例和GOTO体例则和其定名的意义不异, 分离经由过程switch和goto来分发opcode到对应的处置逻辑(段).
    官方给出的描写是:
    CALL – Uses function handlers for opcodes
    SWITCH – Uses switch() statement for opcode dispatch
    GOTO – Uses goto for opcode dispatch (threaded opcodes architecture)
    GOTO is usually (depends on CPU and compiler) faster than SWITCH, which
    tends to be slightly faster than CALL.
    CALL is default because it doesn’t take very long to compile as opposed
    to the other two and in general the speed is quite close to the others.
    那末假如利用GOTO体例, 效力上究竟能进步几何呢?
    明天我就分离利用各类体例来测试一番, 测试剧本bench.php.
    第一点被证实的就是, 官方说的GOTO体例编译耗时明显高于其他俩种体例, 我一入手下手在虚拟机上编译, 每次都Hangup(), 最初只好换了个微弱点的物理机, 大约3分钟后, 编译胜利..
    测试情况:
   
    PHP 5.3.0 Linux
    AMD Opteron(tm) Processor 270(2G) X 4 6G Memory
   
    编译参数:
   
    ./configure --with-zend-vm=CALL/GOTO/SWITCH
   
    测试了局以下(都是三次取中值):
    CALL体例:
   
    laruence@dev01.tc$ sapi/cli/php bench.php
    simple 0.358
    simplecall 0.418
    simpleucall 0.405
    simpleudcall 0.424
    mandel 1.011
    mandel2 1.238
    ackermann(7) 0.375
    ary(50000) 0.083
    ary2(50000) 0.075
    ary3(2000) 0.561
    fibo(30) 1.156
    hash1(50000) 0.114
    hash2(500) 0.091
    heapsort(20000) 0.270
    matrix(20) 0.276
    nestedloop(12) 0.599
    sieve(30) 0.350
    strcat(200000) 0.039
    ------------------------
    Total 7.844
   
    SWITCH体例:
   
    laruence@dev01.tc$ sapi/cli/php bench.php
    simple 0.393
    simplecall 0.414
    simpleucall 0.424
    simpleudcall 0.445
    mandel 1.007
    mandel2 1.254
    ackermann(7) 0.392
    ary(50000) 0.084
    ary2(50000) 0.073
    ary3(2000) 0.593
    fibo(30) 1.185
    hash1(50000) 0.120
    hash2(500) 0.092
    heapsort(20000) 0.285
    matrix(20) 0.295
    nestedloop(12) 0.678
    sieve(30) 0.359
    strcat(200000) 0.042
    ------------------------
    Total 8.138
   
    GOTO体例 :
   
    laruence@dev01.tc$ sapi/cli/php bench.php
    simple 0.306
    simplecall 0.373
    simpleucall 0.369
    simpleudcall 0.385
    mandel 0.879
    mandel2 1.132
    ackermann(7) 0.356
    ary(50000) 0.081
    ary2(50000) 0.073
    ary3(2000) 0.525
    fibo(30) 1.043
    hash1(50000) 0.111
    hash2(500) 0.088
    heapsort(20000) 0.247
    matrix(20) 0.247
    nestedloop(12) 0.519
    sieve(30) 0.331
    strcat(200000) 0.037
    ------------------------
    Total 7.103
   
    可见, GOTO体例最快, SWITCH体例最慢.和官方的描写稍有不符.
    GOTO体例比其默许的CALL体例, 功能提拔仍是对照分明的.
    所以, 假如你但愿让PHP发扬到机制, 改动Zend VM的分发体例, 也能够做为一个思索要素.
    附:
    利用GOTO体例的configure选项:
   
    --with-zend-vm=GOTO
   
    也能够在Zend目次下利用:
   
    php zend_vm_gen.php --with-vm-kind=[CALLGOTOSWITH]
   
    测试剧本bench.php
   
    
    /**
    * PHP Perf Bench Test Script
    */
    function simple() {
    $a = 0;
    for ($i = 0; $i < 1000000; $i++)
    $a++;
    $thisisanotherlongname = 0;
    for ($thisisalongname = 0; $thisisalongname < 1000000; $thisisalongname++)
    $thisisanotherlongname++;
    }
    /****/
    function simplecall() {
    for ($i = 0; $i < 1000000; $i++)
    strlen("hallo");
    }
    /****/
    function hallo($a) {
    }
    function simpleucall() {
    for ($i = 0; $i < 1000000; $i++)
    hallo("hallo");
    }
    /****/
    function simpleudcall() {
    for ($i = 0; $i < 1000000; $i++)
    hallo2("hallo");
    }
    function hallo2($a) {
    }
    /****/
    function mandel() {
    $w1=50;
    $h1=150;
    $recen=-.45;
    $imcen=0.0;
    $r=0.7;
    $s=0; $rec=0; $imc=0; $re=0; $im=0; $re2=0; $im2=0;
    $x=0; $y=0; $w2=0; $h2=0; $color=0;
    $s=2*$r/$w1;
    $w2=40;
    $h2=12;
    for ($y=0 ; $y<=$w1; $y=$y+1) {
    $imc=$s*($y-$h2)+$imcen;
    for ($x=0 ; $x<=$h1; $x=$x+1) {
    $rec=$s*($x-$w2)+$recen;
    $re=$rec;
    $im=$imc;
    $color=1000;
    $re2=$re*$re;
    $im2=$im*$im;
    while( ((($re2+$im2)<1000000) && $color>0)) {
    $im=$re*$im*2+$imc;
    $re=$re2-$im2+$rec;
    $re2=$re*$re;
    $im2=$im*$im;
    $color=$color-1;
    }
    if ( $color==0 ) {
    print "_";
    } else {
    print "#";
    }
    }
    print "
";
    flush();
    }
    }
    /****/
    function mandel2() {
    $b = " .:,;!/>)&IH%*#";
    //float r, i, z, Z, t, c, C;
    for ($y=30; printf("\n"), $C = $y*0.1 - 1.5, $y--;){
    for ($x=0; $c = $x*0.04 - 2, $z=0, $Z=0, $x++ < 75;){
    for ($r=$c, $i=$C, $k=0; $t = $z*$z - $Z*$Z + $r, $Z = 2*$z*$Z + $i, $z=$t, $k<5000; $k++)
    if ($z*$z + $Z*$Z > 500000) break;
    echo $b[$k%16];
    }
    }
    }
    /****/
    function Ack($m, $n){
    if($m == 0) return $n+1;
    if($n == 0) return Ack($m-1, 1);
    return Ack($m - 1, Ack($m, ($n - 1)));
    }
    function ackermann($n) {
    $r = Ack(3,$n);
    print "Ack(3,$n): $r\n";
    }
    /****/
    function ary($n) {
    for ($i=0; $i<$n; $i++) {
    $X[$i] = $i;
    }
    for ($i=$n-1; $i>=0; $i--) {
    $Y[$i] = $X[$i];
    }
    $last = $n-1;
    print "$Y[$last]\n";
    }
    /****/
    function ary2($n) {
    for ($i=0; $i<$n;) {
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    }
    for ($i=$n-1; $i>=0;) {
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    }
    $last = $n-1;
    print "$Y[$last]\n";
    }
    /****/
    function ary3($n) {
    for ($i=0; $i<$n; $i++) {
    $X[$i] = $i + 1;
    $Y[$i] = 0;
    }
    for ($k=0; $k<1000; $k++) {
    for ($i=$n-1; $i>=0; $i--) {
    $Y[$i] += $X[$i];
    }
    }
    $last = $n-1;
    print "$Y[0] $Y[$last]\n";
    }
    /****/
    function fibo_r($n){
    return(($n < 2) ? 1 : fibo_r($n - 2) + fibo_r($n - 1));
    }
    function fibo($n) {
    $r = fibo_r($n);
    print "$r\n";
    }
    /****/
    function hash1($n) {
    for ($i = 1; $i <= $n; $i++) {
    $X[dechex($i)] = $i;
    }
    $c = 0;
    for ($i = $n; $i > 0; $i--) {
    if ($X[dechex($i)]) { $c++; }
    }
    print "$c\n";
    }
    /****/
    function hash2($n) {
    for ($i = 0; $i < $n; $i++) {
    $hash1["foo_$i"] = $i;
    $hash2["foo_$i"] = 0;
    }
    for ($i = $n; $i > 0; $i--) {
    foreach($hash1 as $key => $value) $hash2[$key] += $value;
    }
    $first = "foo_0";
    $last = "foo_".($n-1);
    print "$hash1[$first] $hash1[$last] $hash2[$first] $hash2[$last]\n";
    }
    /****/
    function gen_random ($n) {
    global $LAST;
    return( ($n * ($LAST = ($LAST * IA + IC) % IM)) / IM );
    }
    function heapsort_r($n, &$ra) {
    $l = ($n >> 1) + 1;
    $ir = $n;
    while (1) {
    if ($l > 1) {
    $rra = $ra[--$l];
    } else {
    $rra = $ra[$ir];
    $ra[$ir] = $ra[1];
    if (--$ir == 1) {
    $ra[1] = $rra;
    return;
    }
    }
    $i = $l;
    $j = $l << 1;
    while ($j <= $ir) {
    if (($j < $ir) && ($ra[$j] < $ra[$j+1])) {
    $j++;
    }
    if ($rra < $ra[$j]) {
    $ra[$i] = $ra[$j];
    $j += ($i = $j);
    } else {
    $j = $ir + 1;
    }
    }
    $ra[$i] = $rra;
    }
    }
    function heapsort($N) {
    global $LAST;
    define("IM", 139968);
    define("IA", 3877);
    define("IC", 29573);
    $LAST = 42;
    for ($i=1; $i<=$N; $i++) {
    $ary[$i] = gen_random(1);
    }
    heapsort_r($N, $ary);
    printf("%.10f\n", $ary[$N]);
    }
    /****/
    function mkmatrix ($rows, $cols) {
    $count = 1;
    $mx = array();
    for ($i=0; $i<$rows; $i++) {
    for ($j=0; $j<$cols; $j++) {
    $mx[$i][$j] = $count++;
    }
    }
    return($mx);
    }
    function mmult ($rows, $cols, $m1, $m2) {
    $m3 = array();
    for ($i=0; $i<$rows; $i++) {
    for ($j=0; $j<$cols; $j++) {
    $x = 0;
    for ($k=0; $k<$cols; $k++) {
    $x += $m1[$i][$k] * $m2[$k][$j];
    }
    $m3[$i][$j] = $x;
    }
    }
    return($m3);
    }
    function matrix($n) {
    $SIZE = 30;
    $m1 = mkmatrix($SIZE, $SIZE);
    $m2 = mkmatrix($SIZE, $SIZE);
    while ($n--) {
    $mm = mmult($SIZE, $SIZE, $m1, $m2);
    }
    print "{$mm[0][0]} {$mm[2][3]} {$mm[3][2]} {$mm[4][4]}\n";
    }
    /****/
    function nestedloop($n) {
    $x = 0;
    for ($a=0; $a<$n; $a++)
    for ($b=0; $b<$n; $b++)
    for ($c=0; $c<$n; $c++)
    for ($d=0; $d<$n; $d++)
    for ($e=0; $e<$n; $e++)
    for ($f=0; $f<$n; $f++)
    $x++;
    print "$x\n";
    }
    /****/
    function sieve($n) {
    $count = 0;
    while ($n-- > 0) {
    $count = 0;
    $flags = range (0,8192);
    for ($i=2; $i<8193; $i++) {
    if ($flags[$i] > 0) {
    for ($k=$i+$i; $k <= 8192; $k+=$i) {
    $flags[$k] = 0;
    }
    $count++;
    }
    }
    }
    print "Count: $count\n";
    }
    /****/
    function strcat($n) {
    $str = "";
    while ($n-- > 0) {
    $str .= "hello\n";
    }
    $len = strlen($str);
    print "$len\n";
    }
    /*****/
    function getmicrotime()
    {
    $t = gettimeofday();
    return ($t['sec'] + $t['usec'] / 1000000);
    }
    function start_test()
    {
    ob_start();
    return getmicrotime();
    }
    function end_test($start, $name)
    {
    global $total;
    $end = getmicrotime();
    ob_end_clean();
    $total += $end-$start;
    $num = number_format($end-$start,3);
    $pad = str_repeat(" ", 24-strlen($name)-strlen($num));
    echo $name.$pad.$num."\n";
    ob_start();
    return getmicrotime();
    }
    function total()
    {
    global $total;
    $pad = str_repeat("-", 24);
    echo $pad."\n";
    $num = number_format($total,3);
    $pad = str_repeat(" ", 24-strlen("Total")-strlen($num));
    echo "Total".$pad.$num."\n";
    }
    $t0 = $t = start_test();
    simple();
    $t = end_test($t, "simple");
    simplecall();
    $t = end_test($t, "simplecall");
    simpleucall();
    $t = end_test($t, "simpleucall");
    simpleudcall();
    $t = end_test($t, "simpleudcall");
    mandel();
    $t = end_test($t, "mandel");
    mandel2();
    $t = end_test($t, "mandel2");
    ackermann(7);
    $t = end_test($t, "ackermann(7)");
    ary(50000);
    $t = end_test($t, "ary(50000)");
    ary2(50000);
    $t = end_test($t, "ary2(50000)");
    ary3(2000);
    $t = end_test($t, "ary3(2000)");
    fibo(30);
    $t = end_test($t, "fibo(30)");
    hash1(50000);
    $t = end_test($t, "hash1(50000)");
    hash2(500);
    $t = end_test($t, "hash2(500)");
    heapsort(20000);
    $t = end_test($t, "heapsort(20000)");
    matrix(20);
    $t = end_test($t, "matrix(20)");
    nestedloop(12);
    $t = end_test($t, "nestedloop(12)");
    sieve(30);
    $t = end_test($t, "sieve(30)");
    strcat(200000);
    $t = end_test($t, "strcat(200000)");
    total($t0, "Total");
    ?>
把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-2-16 00:33:44 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
简单生活 该用户已被删除
板凳
发表于 2015-2-28 03:25:45 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
山那边是海 该用户已被删除
地板
发表于 2015-2-28 04:07:29 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
因胸联盟 该用户已被删除
5#
发表于 2015-3-9 20:44:15 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
小妖女 该用户已被删除
6#
发表于 2015-3-11 12:25:50 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-11 20:59:48 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
不帅 该用户已被删除
8#
发表于 2015-3-16 04:10:22 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
柔情似水 该用户已被删除
9#
发表于 2015-3-17 17:09:33 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
再见西城 该用户已被删除
10#
发表于 2015-3-24 12:42:28 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
谁可相欹 该用户已被删除
11#
发表于 2015-3-28 18:45:48 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
老尸 该用户已被删除
12#
发表于 2015-4-1 22:08:52 | 只看该作者
当然这种网站的会员费就几十块钱。
金色的骷髅 该用户已被删除
13#
发表于 2015-4-7 02:27:35 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
飘灵儿 该用户已被删除
14#
发表于 2015-4-10 09:32:57 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
飘飘悠悠 该用户已被删除
15#
发表于 2015-4-13 19:35:45 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
小女巫 该用户已被删除
16#
发表于 2015-4-16 11:11:37 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
乐观 该用户已被删除
17#
发表于 2015-4-26 12:56:48 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
深爱那片海 该用户已被删除
18#
发表于 2015-5-1 08:10:35 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
透明 该用户已被删除
19#
发表于 2015-5-2 15:46:22 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
莫相离 该用户已被删除
20#
发表于 2015-6-15 13:15:27 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表