C與PHP速度對比

來源:互聯網
上載者:User

一直就知道PHP是C寫的,網上大部分實際應用消耗效能的模組就是由PHP的拓展C來重寫的,網上曾經看過百度的一篇大話PHP效能 ,對此文看法很是贊同的。

很早就相對PHP和C進行一個親測的對比了,無奈當時對於Zend API不瞭解,現在本文就是親自來測試一下C與PHP的差距。

我想不好拿什麼來測試,於是題目就是對一個大小為3000的數組進行冒泡排序,看時間。

一共分為3種情況

  1. C實現
  2. PHP實現
  3. 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.