8
回答
zephir是不是生成的C代码质量很低
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

测试的PHP是5.4.5版本

zephir是PHP开发C扩展的捷径

理论上C开发的PHP模块应该速度更快,zephir用递归编写的斐波那契数

namespace Feibo;
class Good{
		public function fibonacci(int  n) -> int {
				if (n == 1 ||  n == 0){
						return n;
					}
				
				return  this->fibonacci(n - 1) + this->fibonacci(n - 2);
			}
		public function startf(){
			this->fibonacci(30);
		}
	}



php用递归的斐波那契数

function fibonacci($n)
{
    if ($n == 1 or $n == 0) {
        return $n;
    }
    return fibonacci($n - 1) + fibonacci($n - 2);
}
$startTime = microtime(true);
var_dump($startTime);
fibonacci(30);
$endTime = microtime(true);
var_dump($endTime);
var_dump($endTime - $startTime);

我把模块直接编译到了PHP核心

消耗时间



我用PHP 直接进行计算



真是没有想到,C模块竟然消耗的时间是原声PHP的几乎两倍。是不是zephir生成的C代码冗余太多了,影响了性能。

<无标签>
举报
共有8个答案 最后回答: 2年前

zephir看上去很美,然后被php 7啪啪打脸了。php 7都直追hhvm。为什么要写成C扩展呢,好玩?有意思吗?php性能还不够耍?那应该考虑换个语言,Go、Java都是好选择,而不是PHP。

好好想想,其实业务中50-60%的方法,都是php直接调C方法的,剩下的部分,才是PHP,这还不够,好好改善你的程序吧。

再换个角度说吧,PHP这种顺序式编程,最大的性能瓶颈不是语言本身,而是相关业务所造成的io阻塞。想清楚业务流,那些是必须,那些是可以外部的,分清楚,会觉得PHP性能好好哦!

--- 共有 10 条评论 ---
宏哥回复 @mark35 : 我就是这样用的 ,感觉那个bcompiler没有能升级上来很可惜, 我现在没有时间去弄那个C代码 2年前 回复
mark35回复 @曾建凯 : zephir用来加密几个关键文件即可,不可能整个项目都加密。zend加密也基本是如此 2年前 回复
曾建凯回复 @南湖船老大 : 我会说,别闹了,如果要加密,不如搞搞java,.net好了,不然golang、rust也很好,何必自己折腾自己呢。等你加密完,客户已经提了一条街的需求了。 2年前 回复
南湖船老大回复 @曾建凯 : 对呀,没本事写C的人太多了,所以才去折腾这个。你又不是不知道,PHP是玩加密最多的web语言,各种各样的加密工具(zend官方的非官方的),混淆工具(phpjm.net这种变态级别的),一直是PHP里最大的需求 2年前 回复
曾建凯回复 @南湖船老大 : 加密为什么不用C自己写一个加载器,用zephir,整个项目源码编写都变了,你确定不是在晃我?别自欺欺人了,没本事写C,也没必要去折腾zephir。 2年前 回复

引用来自“曾建凯”的评论

zephir看上去很美,然后被php 7啪啪打脸了。php 7都直追hhvm。为什么要写成C扩展呢,好玩?有意思吗?php性能还不够耍?那应该考虑换个语言,Go、Java都是好选择,而不是PHP。

好好想想,其实业务中50-60%的方法,都是php直接调C方法的,剩下的部分,才是PHP,这还不够,好好改善你的程序吧。

再换个角度说吧,PHP这种顺序式编程,最大的性能瓶颈不是语言本身,而是相关业务所造成的io阻塞。想清楚业务流,那些是必须,那些是可以外部的,分清楚,会觉得PHP性能好好哦!

5.6 都足够快了,主要是 用zephir代码保护

性能在IO,我们都在postgresql这个环节提高性能

--- 共有 1 条评论 ---
曾建凯其实我也考虑过pg SQL但因为涉及整个团队切换,所以暂缓了。pgsql很强大。 2年前 回复

我测试的结果也是比php更慢,如果不在zephir中调用php内置函数,性能是php的5倍,一旦调用了php内置,就会比php本身还慢,而zephir自带的函数太少,所以这东西就勇敢的抛弃吧。

namespace Zeph;

class Service{

    public function cac(float a, float b){
        return a * b + a / b + b;
    }

    public function cac2() -> int{
        float i = 0;
        int c = 0;
        while(i < 10000000){
            let c += this->aaa(i);
            let i++;
        }

        return c;
    }

    private function aaa(float i) -> int{

        float a = i + 1;
        float b = 2.3;
        string s = "abcdefkkbghisdfdfdsfds";

        if(a > b){
            let a++;
        }else{
            let b = b + 1;
        }

        if(a == b){
            let b = b + 1;
        }

        float c = a  * b + a / b + b;
        string d = substr(s, 0, s->index("kkb")) + strval(c);
        return d->length();
    }
}



顶部