C と PHP の速度比較

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-13 12:51:43
オリジナル
826 人が閲覧しました

C と PHP の速度比較

私は、PHP が C で書かれていることを以前から知っていました。インターネット上の実際のアプリケーションのパフォーマンスを消費するモジュールのほとんどは、PHP 拡張機能 C によって書き直されています。インターネット上の Baidu で PHP のパフォーマンスに関する記事を読み、これに同意します。記事。

残念ながら、私は非常に早い段階で PHP と C の個人的な比較テストを実施しましたが、この記事では 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&#43;&#43;)
    {
        data[i] = rand()%10000&#43;1;
    }
    int j,temp;
    for(i=0;i<length;i&#43;&#43;)
    {
        for(j=0;j<length-1-i;j&#43;&#43;)
        {
            if(data[j] > data[j&#43;1])
            {
                temp = data[j];
                data[j] = data[j&#43;1];
                data[j&#43;1] = temp;
            }
        }
    }

   /* for(i=0;i<length;i&#43;&#43;)
    {
        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&#43;&#43;)
    {
        array_push($data,rand(0,10000));
    }
//    var_dump($data);
    $temp;
    for($i=0;$i<count($data);$i&#43;&#43;)
    {
        for($j=0;$j<count($data)-1-$i;$j&#43;&#43;)
        {
            if($data[$j] > $data[$j&#43;1])
            {
                $temp = $data[$j];
                $data[$j] = $data[$j&#43;1];
                $data[$j&#43;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&#43;&#43;)
    {	
		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&#43;&#43;)
    {
        for(j=0;j<count-1-i;j&#43;&#43;)
        {
            if(data[j] > data[j&#43;1])
            {
                temp = data[j];
                data[j] = data[j&#43;1];
                data[j&#43;1] = temp;
            }
        }
    }
    for(i=0;i<count;i&#43;&#43;)
    {
		php_printf("%d\n",data[i]);	
	}
}
ログイン後にコピー

次に、PHP で

を呼び出します
<?php
    $start_time =microtime(true);

    $data =array();
    for($i=0; $i<3000; $i&#43;&#43;)
    {
       $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
使用時間: 0.090000-0.110000

2.PHP
使用時間:11.867825984955

3.PHP拡張(C)
使用時間:0.12569403648376

この場合、C は PHP よりも 100 倍以上高速であることが明確にわかります。PHP の拡張ではモジュールが C に変換されて処理されるため、その差も小さくなります。

この間のギャップは、一方では、PHP と C には異なる弱い型指定の変数があることです (PHP 変数は、カーネル内で zval によって表され、long、float、obj、array などの 7 種類の変数を抽象化します)。関数のカプセル化 (目視による検査はパフォーマンスに非常に負荷がかかります) が誇張されているため、速度が低下します。

ただし、この例は代表的なものではないかもしれませんが、それでも一般的なアイデアを得ることができます。

このことから、PHP の多くの関数が C で書かれている理由がわかります。基本的に、PHP の外部関数のほとんどは C で書かれています。Pear と pecl が登場したのは、C を書けないのも不思議ではありません。PHP プログラマはあまり優秀ではありません。プログラマー。

中国の PHP 界の巨人である Laruence の Yaf は C で書かれており、伝説的な最速の PHP Web フレームワークです。機会があればソースコードを勉強してみたいと思っています。




元のテキストは独立したブログからのものです http://blog.imsuzie.com/archives/573

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート