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)
依次类推。。
以下得出的测试结果不是想说明什么,只是测试来玩的,哈哈。
语言类型 | 参数值 | 返回值 | 最短耗时 | 最长耗时 |
原生PHP | 10000 | 166716670000 | 1.3152639865875 | 1.3798718452454 |
PHP拓展 | 10000 | 166716670000 | 0.015380859375 | 0.056157112121 |
GO语言 | 10000 | 166716670000 | 0.019739002ms | 0.065113203ms |
C语言 | 10000 | 166716670000 | 0.015355 | 0.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; }
我来说两句: