2011-05-10 12 views
2

迅速にmysqlのため、オープンを選択し、データの一般的な出力がどうなるか疑問に思う:パフォーマンスが向上しました... exec(C++)またはストレートPHP?

A)C++コードをコンパイルし、(execを介して呼び出されている)(または同等のもの)

または

B)ストレートPHPコード。

すべてのコードがC++とPHPの両方で等しくコード化されているとします。

は、テストをした: これはC++

Document Length:  100000 bytes 
Concurrency Level:  2 
Time taken for tests: 0.139 seconds 
Complete requests:  10 
Failed requests:  0 
Write errors:   0 
Total transferred:  1001550 bytes 
HTML transferred:  1000000 bytes 
Requests per second: 71.76 [#/sec] (mean) 
Time per request:  27.872 [ms] (mean) 
Time per request:  13.936 [ms] (mean, across all concurrent requests) 
Transfer rate:   7018.29 [Kbytes/sec] received 

これはPHPである:ここでは

Concurrency Level:  2 
Time taken for tests: 4.115 seconds 
Complete requests:  10 
Failed requests:  0 
Write errors:   0 
Total transferred:  1001550 bytes 
HTML transferred:  1000000 bytes 
Requests per second: 2.43 [#/sec] (mean) 
Time per request:  822.924 [ms] (mean) 
Time per request:  411.462 [ms] (mean, across all concurrent requests) 
Transfer rate:   237.71 [Kbytes/sec] received 

はプログラムがある(私はかどうかを確認したかった-JUST MySQLのコードが含まれていませんでした基本コードではスタックの作成が速くなりました)。

C++

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    stringstream x; 
    //string x; 
    for (int i = 0; i < 100000; ++i) 
    { 
     x << "X"; 
    } 

    cout << x.str(); 
    return 0; 
} 

ここではPHPです:

for ($i=0; $i<100000; ++$i) 
{ 
    $x = $x . "X"; 
} 

echo $x; 

stringsteamを使用して、その公正テスト場合...考えを知っていますか?私の考えは、C++は新しいスタックインスタンスとmysql接続に関係なく高速化する予定です。

編集:これでテスト

:まだ速く

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    //stringstream x; 
    string x; 
    for (int i = 0; i < 100000; ++i) 
    { 
     x = x + "X"; 
    } 

    cout << x; 
    return 0; 
} 

と、!

Concurrency Level:  2 
Time taken for tests: 0.115 seconds 
Complete requests:  10 
Failed requests:  0 
Write errors:   0 
Total transferred:  1740 bytes 
HTML transferred:  0 bytes 
Requests per second: 86.98 [#/sec] (mean) 
Time per request:  22.994 [ms] (mean) 
Time per request:  11.497 [ms] (mean, across all concurrent requests) 
Transfer rate:   14.78 [Kbytes/sec] received 

編集:ここでは

はあなたが読み取りの数百を処理している場合を除き/秒あたりの書き込みをC++ファイル

<?php 

echo exec("./test"); 
+4

まあ、両方と時間/プロファイルを試してみませんか? – Xeo

+0

PHPセッションに関連付けられたDB接続ハンドルを維持することは直感的です.PHARでは、PEAR :: MDB2のような接続レイヤーを使用してより即時にアクセスすることができます。 – darvids0n

+0

perlで同様のことをしたプログラムを扱ったので、完全にネイティブな実装(Pythonで)に切り替えると、実行時間が10分から1分に短縮されたことが分かります。比較のために、我々は〜300のシェル呼び出しを行っていました。 – debracey

答えて

6

だから見てみましょう。シェルを起動して、いくつかの引数を渡して、一連の.soライブラリをロードする別のアプリケーションを起動し、次にmysqlに接続して、何かを行い、printf()またはこれはPHPにフィードバックされ、プレーンテキストとして解析され、分割され、一種の一貫した構造になります。

これは、MySQLでクエリを実行してデータをPHP構造体に直接取得するよりも速くなりますか?

たぶん、あなたはあなたがPHPの拡張機能としてのあなたのcompliled C++コードにパッチを適用する場合は、[はい、それは理にかなって...

+1

私はすでに誰かがこれをやったことを望んでいました。私は数日待ってから始めるつもりです。私はここに仕事を報告します。 – MichaelICE

+0

PHP構造に直接データを取り込むことはありません。舞台裏では、これらすべてのことがまだ進行中です。 – Pacerier

+0

@Pacerier:もしPHPがmysqlと話していると思うなら、あなたはソースコードを調べることをお勧めします。 .so(通常はmysqlがコンパイルされていますが)をロードしている可能性がありますが、printfとテキスト解析を使用してデータを前後に取得しているわけではありません。 –

0

を呼び出すPHPプログラムで、差は非常に可能性が高くなりますほとんど存在しない場合はごくわずかです。

0

それをテストする必要があります。しかし、C/C++による結果データの重要な計算をしない限り、PHPスクリプトコードとして実行するよりも高速ではありません。

データベーススキームを最適化/非正規化するか、非同期にクエリを使用すると、パフォーマンスが向上する可能性が高くなります(スクリプトの開始時にmysql_queryを発行し、何かを実行し、mysql_fetch_assocのみにmysqldサーバ結果セットを準備するためのミリ秒)。