PHP拓展的使用体验

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/144/ ]

前段时间接触了一个PHP的拓展,那就是swoole,然后就被它的性能深深的吸引了.为了能让mPHP兼容swoole,我开始对mPHP做了相应的调整,很快我的博客就启用了swoole拓展.​自从接触了swoole,我就开始关注PHP拓展,于是就写了这一篇文章来记录我的使用体验.

前段时间接触了一个PHP的拓展,那就是swoole,然后就被它的性能深深的吸引了。为了能让mPHP兼容swoole,我开始对mPHP做了相应的调整,很快我的博客就启用了swoole拓展。

自从接触了swoole,我就开始关注PHP拓展,于是就写了这一篇文章来记录我的使用体验。

每当尝试新的东西,我都很想做一下性能方面的对比,尝鲜体验一下。就写了一个简单的规则,进行计算,看看哪种方式的耗时比较短。这里用了原生PHP、PHP拓展、GO语言、C语言进行比较。

规则是这样的:

当n = 2时,需要计算(1 + 2) + (1)

当n = 3时,需要计算(1 + 2 + 3) + (1 + 2) + (1)

当n = 4时,需要计算(1 + 2 + 3 + 4) + (1 + 2 + 3) + (1 + 2) + (1)

依次类推。。

以下得出的测试结果不是想说明什么,只是测试来玩的,哈哈。

语言类型参数值
返回值
最短耗时最长耗时
原生PHP10000
1667166700001.31526398658751.3798718452454
PHP拓展100001667166700000.0153808593750.056157112121
GO语言100001667166700000.019739002ms0.065113203ms
C语言100001667166700000.0153550.068987

原生PHP测试

<?php
$i = 10000;
$stime = microtime(1);
$sum = sum($i);
$etime = microtime(1);
echo $sum ,'<br>';
echo ($etime - $stime),'<br>';

function  sum($num) {
    $sum = 0;
    for( ; $num; --$num ) {
        for( $i = $num; $i; --$i) {
            $sum += $i;
        }
    }
    return $sum;
}


PHP拓展测试

<?php
$i = 10000;
$stime = microtime(1);
$sum = ext_sum($i);
$etime = microtime(1);
echo $sum ,'<br>';
echo ($etime - $stime),'<br>';

PHP拓展核心代码

PHP_FUNCTION(ext_sum) {
    long num = 0;
    long sum = 0;
    long i = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
        RETURN_NULL();
    }
    
   for( ; num; --num ) {
        for( i = num; i; --i) {
            sum += i;
        }
    }
    
    RETURN_LONG(sum);
}

GO语言测试

package main
import (
    "fmt"
    "time"
)

func sum(i int) int {
    sum := 0
    for ; i > 0; i-- {
        for k := i; k > 0; k-- {
            sum += k
        }
    }
    return sum
}

func main() {
    time1 := time.Now()
    x := sum(10000)
    time2 := time.Now()
    fmt.Println(x)
    fmt.Println(time2.Sub(time1))
}

C语言测试

#include<stdio.h>
#include<sys/time.h>

long long int sum(int num) {
    int i;
    long long int sum = 0;
    for( ; num; num-- ) {
        for( i = num; i; i--) {
            sum += i;
        }
    }
    return sum;
}

int main() {
    struct timeval stime,etime;  
    long long int num;
    float timeuse;
    
    gettimeofday(&stime, NULL );  
    num = sum(10000);
    gettimeofday(&etime, NULL );  
    
    timeuse = 1000000 * ( etime.tv_sec - stime.tv_sec ) + etime.tv_usec - stime.tv_usec;  
    printf("%ld\n",num);
    printf("time=%f(s)\n",timeuse / 1000000.0);  
    return 0;
}


评论:

  1. 暂无评论...
  2. 我来说两句:

      切换  

    磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

      切换  

    磨途歌随机验证码