FastCGI C++ と PHP/Python/Perl を使用して同じ仕事をすることの長所と短所は何ですか。
パフォーマンスやデザインの落とし穴、または一方を他方に使用することはありますか? ご意見でも構いません。(どちらか一方がうまくいかない理由、またはどちらか一方がひどい理由を教えてください)。
スクリプト言語は C より遅いかもしれませんが、これは問題ですか? ほとんどは決してない。パフォーマンスが問題になると、重要な部分だけを翻訳し始めます。
twitter/ruby が良い例です。Rubyは遅いです。いくつかの言語機能 (そもそも Ruby を優れたものにするもの) は、さまざまな種類の最適化を妨げるだけです (これについては jruby の人による素晴らしい記事があります ... ola bini でしたか? 覚えていません)。
それでも、twitter は ruby で動いています。なぜなら、ruby は十分に速いからです。少し前に、"ブログ" は、パフォーマンス上の理由から twitter が scala に移行したことを報告しました。yahoo はさまざまな言語で動作します。フロントエンドには php を使用しますが、パフォーマンスが重要な場合は他のより高速な言語が使用されます。
では、なぜパフォーマンスはそれほど重要ではないのでしょうか? いくつかの理由があります:
もう 1 つのプロ スクリプト ポイント: スクリプト言語の多くはインライン化または高速 (C) コードのインクルードをサポートしています。
特に Web 開発では、高レベルのスクリプト作成の長所が短所をはるかに上回っていると思います。
数年前、私は多かれ少なかれ仕事で Web アプリのプログラミングを学びました。私が知っている主な言語は C だったので、(かなり大規模な) Web アプリを C で書きました。悪い間違いです。C の文字列処理とメモリ管理は退屈で、Web アプリケーションの経験が不足しているため、すぐに保守が困難なプロジェクトになりました。
C++ は、主std::string
に よりもはるかに優れているため、大幅に優れていchar*
ます。
ただし、今では毎回 Python を使用しています (ただし、PHP は悪い選択ではなく、おそらく使い始めるのも簡単です)。Python の文字列処理は素晴らしく、Unicode をシームレスに処理します。Python には、C++ よりもはるかに優れた Web ツールとフレームワークがあり、その正規表現処理と標準ライブラリ (urllib、email など) は非常にうまく機能します。また、メモリ管理について心配する必要はありません。
RAM の制約が厳しい場合 (組み込みマイクロなど)、または Google で働いていて、何千ものクエリに応答する必要がある検索エンジンをコーディングしている場合にのみ、Web アプリに C または C++ を使用するでしょう。毎秒。
C++ を使用すると、PHP、Perl、または Python よりも大幅に高速なアプリケーションになり、C# または Java よりも多少高速になる可能性があります。ただし、ほとんどの時間を DB の待機に費やす場合を除きます。その場合、違いはありません。これは実際には最も一般的なケースです。
一方、benhoyt が言及した理由により、C++ での Web アプリの開発には時間がかかり、保守が難しくなります。さらに、深刻なセキュリティ ホールが含まれる可能性がはるかに高くなります (現在、誰もが SQL インジェクションと XSS について最も心配しています。しかし、Web アプリケーションを C++ で記述していると、バッファ オーバーフローが発生し、データだけでなくネットワーク全体が p0wned される可能性があります)。 )。
そのため、最近では C++ で Web アプリケーションを作成する人はほとんどいません。
誰かがWebapp/C ++トピックのパイオニアであり、基礎をテストし、概念実証ソリューションを提供する必要があると思います。
STLの登場とBoost解析テキストの開発により、C++ではたまたま非常に簡単になりました。2年前、CSVデータを解析する必要がある場合は、PythonまたはPHPを使用していました。現在、STL/BoostでC++を使用しています。CSVファイルをベクターに読み込みますか?問題ありません。単純なgetline+boost :: split+lexical_castです。ペアのベクトルでデータの合計を計算しますか?問題ない:
pair<int, double> sum_int_double(pair<int,double> & total, pair<struct in_addr, pair<int,double> > & a) {
total.first += a.second.first;
total.second += a.second.second;
return total;
}
pair<int,double> mixedSum = accumulate(mixedVec.begin(), mixedVec.end(), emptyPair, sum_int_double);
マップからペアのベクトルにデータを転送しますか?問題ない:
mixedVec.assign(amap.begin(), amap.end());
すべてが明確でシャープです。文字列操作、正規表現、アルゴリズム、OOPなど、すべてがC ++で明確に定義され、成熟しています。アプリが実際のアプリのようであり、テキストベースの解析ではない場合は、C++もそのOOP機能を備えた良い選択です。
問題は「価値はどこで生み出されるのか」です。
値がメモリ管理で作成されていると思われる場合は、クラスを慎重に設計し、ナイトリービルドを機能させるために、C++を使用してください。参照されなくなったオブジェクトの削除などの重要なことを行うために、多くのコードを書くのに多くの時間を費やすようになります。
人々が使用できるアプリケーションをデプロイすることに価値があると思われる場合は、DjangoフレームワークでPythonを使用してください。Djangoチュートリアルは、約20分以内にアプリケーションを起動して実行できることを示しています。これは本番環境に対応しており、重要なことに集中できます。
モデル。Pythonでモデルを作成するだけで、ORMレイヤーがすべてのデータベース操作を処理します。SQLはありません。手動マッピングはありません。
プレゼンテーション。{{}}
いくつかの「ここに値を入力」していくつかの構成要素を使用してHTMLでページを設計するだけで{% for thing in object_list %}
、ページをすぐに使用できます。文字列操作はありません。
ビュー機能。単純なPython関数を記述して、サイトの処理部分をカプセル化します。検証(フォームにある)、プレゼンテーション(テンプレートにある)、基礎となるモデル(モデルクラスにある)ではなく、少しの承認チェック、クエリ処理、および応答の定式化ではありません。Pythonには豊富なコレクションクラスのセットがあるため、このコードは非常に短く、要領を得たものになります。
他のもの。URLマッピングはPythonの正規表現です。フォームはモデルに一致します。デフォルトをサブクラス化して、カスタマイズされた入力の検証と処理を追加できます。
低レベルのモデル機能とエンドツーエンドの操作のための素晴らしい単体テストフレームワーク。
メモリ管理も、抽象化とインターフェースを備えた綿密なクラス設計もありません。文字列操作を最適化する方法について心配する必要はありません。ナイトリービルドはありません。本当に価値のあるものを作成するだけです。
C/C++ で書かれた既存の実行中のプロセス (デーモンなど) に Web サービスを実装できるようにしたい場合。そのプロセスにそのインターフェースの FastCGI プロトコルを実装させることは理にかなっています。Apache で HTTP (双方向 SSL など) を処理し、ソケットを介して FastCGI を介してフィールド リクエストを処理します。これを PHP で行う場合、PHP をプロセスと対話させる必要があります。つまり、PHP コードとプロセスを維持する必要があります。
FastCGI Web アプリケーション (C++、PHP、Perl、Python、Ruby など) を使用すると、CGI アプリケーションよりも初期起動時間が短縮されます。最初の起動時間とは、Web サーバーがリクエストを受信してから、作成した最初のコード行が実行されるまでの経過時間を意味するため、最初の起動時間は、Web アプリケーションの訪問者が待機する必要がある最小時間です。リクエストごとに。特にアプリケーションが大きい場合や、大規模なフレームワーク (Ruby on Rails など) を使用している場合は、初期起動時間が 1 秒になることは珍しくありません。FastCGI は、最初のリクエストに応答した後もアプリケーションを実行し続けるため、FastCGI は後続のすべてのリクエスト (最初のリクエストを除く) の初期起動時間を通常は数ミリ秒まで短縮します。
PHP を使用する場合、通常はデフォルト設定で十分な初期応答時間が得られますが (FastCGI がなくても)、運用サーバーで PHP アクセラレータを使用していることを確認してください ( http://en.wikipedia.org/wiki/PHP_acceleratorを参照)。 ) パフォーマンスを向上させます。
ほとんどのプログラミング言語とフレームワークでは、コードを変更せずにアプリケーションの構成を変更することで、同じアプリケーションを異なるサーバー モード (CGI、FastCGI、組み込み Web サーバー、Apache モジュールなど) で実行できます。通常、FastCGI はアプリケーションの作成時に最適な選択ではありません。コードを変更した後、変更を反映するためにアプリケーションを再起動する必要がある場合がありますが、通常、FastCGI アプリケーションを再起動するのは面倒です。CGI または組み込み Web サーバーの再起動は、はるかに簡単です。FastCGI は、運用構成でのみ設定する必要があります。
ここには妥協点があります。Python(そしてPerlとRuby)を使用すると、Cから関数を呼び出すことができます。100回のうち99回は、呼び出す必要はありません。しかし、必要に応じてオプションがあることを知っておくと便利です。
通常、Webアプリの場合、プログラミング言語の速度は問題ではありません。単一のデータベースクエリの実行にかかる時間で、プロセッサは数十億の命令を実行できます。httpデータの送受信もほぼ同じです。
以前にこれを尋ねた人がいます: http://cppcms.sourceforge.net/wikipp/en/page/main
CppCMS プロジェクトは、C++ を使用した Web 開発のフレームワークを提供します。
次のベンチマークを見て違いを理解できます: http://cppcms.sourceforge.net/wikipp/en/page/benchmarks -- 約 2 桁。
PHP/Python が非常に遅いという問題は、PHP の FastCGI プロセスでのデータのキャッシュに多くの問題があります。
C++ の最大の問題は、C++ で Web を開発するためのリソースが少ないことです。ただし、CppCMS のようなフレームワークを使用すると、作業がはるかに簡単になります。
おそらくあなたの誰かが、完全にC++で書かれたWebツールキットであるWt[1]に興味を持っているかもしれません。これは、cppCMSの代替となる可能性があります。私はこれらのクリスマス休暇で両方を試しています。
そうですね... C/C++ と Python/Perl/Ruby/Java/.NET を使用すると、メモリと CPU パワーを節約できます。C/C++ を使用して節約されたリソースが、利用可能な総リソース (ロボットの組み込みボードで実行されている FastCGI) の大部分を占める場合は、C/C++ です。そうでなければ、なぜわざわざ?
PHP/Python/Ruby/Perl で FastCGI を使用すると、サイトが非常に大きくなるまで十分なランタイム パフォーマンスを得ることができます。その場合でも、スクリプト言語を放棄することなく、アーキテクチャの改善 (データベースのチューニング、キャッシュなど) を行って、さらにスケーリングすることができます。一部のかなり大きなサイトは、PHP/Python/Ruby/Perl で作成されています。
高水準言語を使用することで得られる大きなメリットは、プログラマーのパフォーマンスです。そして、それはあなたが最初に心配すべきことです。ページの応答時間を数ミリ秒短縮することよりも、ユーザーからの機能要求に迅速に応答することが重要になります。
残念ながら、C/C++ と Perl CGI のベンチマークはありません。
FastCGI がなければ、C/C++ の方がはるかに高速になると思います。FastCGI を使用すると、おそらく高速になります (ただし、初期化部分はすべて 1 回実行されるため、少し遅くなる可能性があります)。
これもアプリケーションに大きく依存するため、さまざまな動的 Web ページの何らかのベンチマークを提供する必要があります。
個人的には、会社にリソースがある場合は、C/C++ に投資する必要がある/できると思います (適切なリソースを見つけなければならないことを考えると...)。それ以外の場合は、スクリプト言語に固執する方がよいでしょう。
当然のことながら、高速なアプリケーションをデプロイする場合は、C/C++ を使用する必要があります。
結局のところ、コンパイルされた言語の方が高速です。しかし、現在、優れた C/C++ 開発者を見つけるのは難しいのではないでしょうか?
乾杯、
C++ は強く型付けされた言語です...つまり、int、float などを宣言できます....一般に、弱く型付けされた言語よりも効率的にプログラミングできます。Facebook は、PHP から C++ に切り替えると 50% の改善が報告されました。スクリプト言語はプロトタイピング言語であると考えています...生産レベルの効率が必要な場合は、コンパイル済み言語を使用します。
Google で検索するたびに、C/C++ は、Web ページ内の情報を検索したり、データベースから情報を取得したりする機能を必要とする Web アプリケーションに最適なパフォーマンスを発揮することを示しています。
これに対するいくつかの新しい答えがあります。
Mojolicious
またはのようなフレームワークを介して行うことができ、 PSGI/PlackDancer
コントローラーを採用することで、CGI、FastCGI、mod_perl、ネイティブ サーバー (Mojolicious の Hypnotoad など) またはクラウド展開で実行できます。 、すべて変更なし。他のスクリプト言語にも同様の概念があります。