一直就知道PHP是C寫的,網上大部分實際應用消耗效能的模組就是由PHP的拓展C來重寫的,網上曾經看過百度的一篇大話PHP效能 ,對此文看法很是贊同的。
很早就相對PHP和C進行一個親測的對比了,無奈當時對於Zend API不瞭解,現在本文就是親自來測試一下C與PHP的差距。
我想不好拿什麼來測試,於是題目就是對一個大小為3000的數組進行冒泡排序,看時間。
一共分為3種情況
- C實現
- PHP實現
- PHP的C拓展,由PHP產生數組,然後交給C處理資料
1.C實現
#include <stdlib.h>#include <stdio.h>#include "time.h"int main(int arg,char **argv){ clock_t start_time = clock(); int data[3000]; int i; int length=sizeof(data)/sizeof(int); for(i=0; i<length;i++) { data[i] = rand()%10000+1; } int j,temp; for(i=0;i<length;i++) { for(j=0;j<length-1-i;j++) { if(data[j] > data[j+1]) { temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; } } } /* for(i=0;i<length;i++) { printf("%d\n",data[i]); }*/ clock_t end_time = clock(); float time = (double)(end_time-start_time)/CLOCKS_PER_SEC; printf("use time: %f",time); return 0;}
2.PHP
<?php $start_time =microtime(true); $data =array(); for($i=0; $i<3000; $i++) { array_push($data,rand(0,10000)); }// var_dump($data); $temp; for($i=0;$i<count($data);$i++) { for($j=0;$j<count($data)-1-$i;$j++) { if($data[$j] > $data[$j+1]) { $temp = $data[$j]; $data[$j] = $data[$j+1]; $data[$j+1] = $temp; } } }// var_dump($data); $end_time =microtime(true); $time = $end_time-$start_time; echo "use time:" ,$time;
3.PHP的C拓展,由PHP產生數組,然後交給C處理資料
PHP_FUNCTION(bubble){zval *array;zval **item;if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"a",&array)==FAILURE){return;} int i;int count;count = zend_hash_num_elements(Z_ARRVAL_P(array)); int j,temp;int data[count];zend_hash_internal_pointer_reset(Z_ARRVAL_P(array)); for(i=0;i<count;i++) {zend_hash_get_current_data(Z_ARRVAL_P(array),(void**)&item);data[i]=(int)Z_STRVAL_PP(item);zend_hash_move_forward(Z_ARRVAL_P(array)); } for(i=0;i<count;i++) { for(j=0;j<count-1-i;j++) { if(data[j] > data[j+1]) { temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; } } } for(i=0;i<count;i++) {php_printf("%d\n",data[i]);}}
然後在PHP裡調用
<?php $start_time =microtime(true); $data =array(); for($i=0; $i<3000; $i++) { $data[$i]=rand(0,10000); } echo bubble($data); $end_time =microtime(true); $time = $end_time-$start_time; echo "use time:" ,$time;
經過對此測試
#C與PHP速度的差別
測試手段對一個大小3000的數組進行排序
1.C
use time: 0.090000-0.110000
2.PHP
use time:11.867825984955
3.PHP拓展(C)
use time:0.12569403648376
我們可以清楚地看到C比PHP在這個情況下快上100+多倍,PHP的拓展把模組轉為C來處理,也同樣可以減小差距。
這中間的差距,一方面肯定是PHP與C不同的弱類型變數(PHP的變數在核心裡是用zval表示的,裡面抽象了7種變數,long,float,obj,array等),還有誇張的函數封裝(目測這個很吃效能),導致速度上不去了。
不過這個例子可能沒啥代表性,不過我們同樣可以瞭解個大概了。
由此我們可以知道為什麼PHP這麼多函數都是用C寫的了,PHP基本上大部分的外置函數都是採用C來寫的,pear和pecl由此應運而生,難怪一個不會寫C的PHP程式員不是真的好程式員。
中國PHP界的大牛laruence的Yaf 就是用C寫的,傳說中速度最快的PHP的Web架構。有機會的真的想研讀一下源碼。
原文來自獨立部落格 http://blog.imsuzie.com/archives/573