はい、C ++サイト

C ++でのWeb に関する 2、3の トピックがすり抜け、多くの仲間がWebでC ++を使用する意味を誤解しました。 したがって、私の経験でこれをどのように使用したかを説明します。 確かに、私はPythonを使用しましたが、それはWebToolKitのようなライブラリが手元になかったからです。



正直に言うと、私はC ++を女性の口紅のハッカーとして理解しています-多くのように、私は主にPHPを使用します(そして、より多くのPythonを使用しますが、Webではほとんど使用しません-OpenGLでは使用します)、それでも気にしません(C ++ )使用します。 これは、言語の複雑さに心配しないでください-見た目ほど悪いものはありません。



しかし、重要なことは、「時期尚早な最適化はすべての悪の根源です」。 そしてこれは重要です。 C ++で複雑なシステムをすぐに書くのは無意味です(もちろん、サイトについて話しているのです)。 最適化するには、原則として、コードの3%のみが必要です。 これらの3パーセントについて説明します。



私はウェブサイトを持っていて、すべてのページにユーザーが何かを書くことができ(長い間説明します)、コーナーにはリアルタイムで(5秒ごとにAJAX更新を介して)「どこで」何を書く「ストリーム」がありました。 PHP / MySQL-テーブルである必要があるため、最後の(比較的言えば:WHERE id> MAX(id)-10 ORDER BY id DESC)レコードを選択しました。 最後の10個を除くすべてを定期的に削除します。 うまくいきました。 これまでのところ、TechCrunchはこのサイトについて書いていない。 この部分のためにサーバーが停止しました。 オフにするとすぐに(約3%を覚えていますか?)-送られてきた何万人もの人々が-サイトを非常によく見始めました。 私はそれを不器用に解決しました-memcacheを作りました。 PHPは最後の10エントリを取得してmemcacheに書き込み、要求に応じてmemcacheから1行を返しました。 しかし、結果としてこの決定は死に始めました。



10行の配列を持つ単純なPython httpサーバーを(標準ライブラリから)作成し、AJAXリクエストを送信するか、新しいものを追加して最初の(FIFO)を削除しました。



つまり、PHP(サーバー上)がフォームを処理し、file_get_contents( 'http://mysite.com:9000/?put='.urlencode($ _GET [msg]))を介して送信しました。 また、AJAX(JavaScriptのクライアントの意味で)はmysite.comで実行されていました :9000 /? get-すべてのApache、PHPインタープリター、MySQL、さらにはmemcachedをバイパスします(まだ接続する必要があります-そして今回はオーバーヘッドです)。



優れたHTTPサーバーライブラリを使用して、このようなアプリケーションをPythonまたはC ++で記述しても違いはありません。 C ++には、高レベルのプログラミング用のツールがすでに多数あります。 平均的なPHPプログラマでさえ、最新のC ++で安全で本格的なアプリケーションを作成できます。



しかし、ここでは既に興味深いものです。実行中のPython HTTPdスクリプトは最大10〜20 MBのRAMを消費し、実行中のC ++サーバーは最近公開されたWebToolKitのみ0.6〜1.4 MB(RESメモリについて話している)です。 したがって、サーバーでのこのような小さな最適化は、海を走らせることができます(Pythonは、小さなVPSで20Mbの断片ですべてのメモリをすぐに使い果たします)。



同様に、たとえば、サイト上のユーザーのリアルタイム表示を作成するには、誰のページで、どこから。



その結果、サイトはまだPHPにあり、何十倍も高速化されます(実行するのが最も難しい部分の最適化により)、データベースがアンロードされ、犬の山のキャッシュ効果はありませんが、約2〜3時間かかりました。この最適化。



別の例は投票です。 AJAXを介して誰かの声を追加し、ユーザーのIPを保存して、もう投票しないようにする必要があるとします。 C ++では、メモリ(おそらくバイト20)を十分に使用するため、すべてのユーザーに関するすべてのデータを安全に保存し、先週のユーザーへの即時アクセスで投票することができます。 同時に、これが通常の方法(PHP / Python + MySQL / SQLite / Postgres ...)で行われた場合、データベースが大きくなり、データベースへのアクセスが遅くなり、呼び出しが絶えず続くと、サーバーが著しく遅くなる可能性があります。 ここでは、SQLが10個のメモリで1回失われるとは言っていませんが、そのような場合があります(特にSQLite:メモリ:SQLiteを数十回または数百回も失う)。



別の例は、ユーザーのGEOロケーションです。 すべてのIPに関する情報を(もちろん範囲の形式で)メモリに読み込むことができ、C ++はナノ秒単位で1サイクルを通過しますが、PHP + MySQLは目的の範囲を長時間選択します。



また、何かのカウンター、たとえば投稿(またはカルマ)の投票数-すべてのユーザーのカルマをメモリに保持し、AJAXがサーバーに直接アクセスできるようにすると同時に、PHP / MySQL、およびDjangoが何をするか:変更を確認してくださいファイルが(PHP)であるかどうか、PHPにオプティマイザーがない場合、目的の場所(djangoのルート)で正規表現チェックを行います-ファイルを再度読み取り、解析し、データベースへの接続を初期化し、1桁を要求し、誰もまだ変更しないようにロックを設定します、それを増やし、戻り、ロックを解除します。



そして、これはORMがなく、それでもDjangoはリクエストを処理して返すためにオブジェクトを作成する場合です。 これはもちろん、すべての問題であり、大惨事ではありませんが、時間の99%を役に立たないものに費やしている場合、1時間でそれらを取り除くのは良くありませんか?



同時に、C ++の場合は、ほぼ2〜3プロセッサクロックサイクル(メモリ内で+1から整数に変換され、文字列に変換されます)。 簡単に言えば、PHP + MySQLはそのようなリクエストを1つ処理しますが、C ++は1000、おそらく100万を作成できます(HTTPプロトコル自体の処理時間を考慮しない場合)。 そして、そのようなC ++プログラムは、実際にはPHP + MySQLよりも短くなります(しかしほとんど長くなりません)。



一般的に、「何かに何かを追加する」、「何かの小さなセットの中から何かを見つける」というレベルのタスクがあれば、C ++サイトの断片があなたを大いに助けてくれます。 しかし、一般的な考え方は、より高いレベル(PHP / Pythonなど)を実行するか、Arcなどの言語を調べる方が優れています。



このアプローチの欠点は?



まあ、より多くのトラブル。



1.監視など。 オプションとして-最も簡単な例として、compiled_file.cppがあり、compiled_file(拡張子なし)にコンパイルされるとします。 crontab(crontab -e)に移動して、次を追加します。



* * * * * / bin / pgrep compile_file || /パス/へ/ compile_file



何か問題が発生した場合、スクリプトは最大1分間待機し、その後再起動します。 本当に-30分未満。



2.作業プロセスを更新します。 はい、ファイルを置き換えるだけで、PHPではできませんので、プロセスを強制終了(killall compile_file)して再起動する必要があります。



したがって、C ++でサイトのアイデアをすぐに破棄するべきではありませんが、狂信に苦しむ必要もありません。 C ++でサイト全体を記述できますが、1日に半分の人しかいない場合、なぜですか?



この言語を使用するだけで十分です。 サーバーの負荷が100%で、リクエストの90%が1か所に送られることがわかっている場合、1 MBのメモリプリントを備えた小さなサーバーとして簡単に表現でき、データベース、インタープリターなどは不要です。 -次に、この作品をコンパイル済みのものに置き換えるのではなく、より高価な機器を購入するのはなぜですか?



そして、C ++が本当に怖いのであれば、CythonがPython用であるものを見てください。





ヨイハジ

ハブルからの眺め



All Articles