質問

の違いは何ですか - 性能面 - 大きな塊に読書対ソケット1バイトから時間を読み間

私は、Webサーバーからページを引き、線で受信したページ行を解析する必要があるC ++アプリケーションを持っています。私はCRLFが発生したか、1024バイトの最大に達するまで、現在、私は一度に1つのバイトを読んでいます。

大きな塊(一度に例えば1024バイト)で読み込みがずっと良い性能面であれば、私は現在(すなわち、一度に1つのHTML行を保存して処理することができるという持って同じ動作を達成するためにどのように任意のアイデア - ?まだ続くバイトを消費することなくCRLF)まで

EDITます:

私はあまりにも大きなバッファを買う余裕はありません。アプリケーションが組み込み機器に使用されているように私は非常にタイトなコード予算にいますよ。私ができれ一度に1つのHTML行を保持するために、唯一の固定サイズのバッファを維持することを好みます。私は私は私は1つの完全なHTML行を処理してると仮定することができ、解析のためのバッファにアクセスしようといつでもでていますので、これは私の解析と他の処理が容易になります。

感謝します。

役に立ちましたか?

解決

あなたがソケットからではなく、バッファリングすることができ、中間上位レベルの表現から直接読んでいる場合は、

、その後、任意の可能性の疑いもなく、完全に1024のバイトを読み取るためにちょうど良いです、バッファ内のRAMに入れて、その後、RAMからのデータを解析します。

なぜ?ソケット上で読むことはシステムコールであり、それは高価であり、それぞれ読み取り、上のコンテキストスイッチが発生します。それについての詳細を読む: IBMテックのLib:ブーストソケット公演

他のヒント

私はC ++にコメントすることはできませんが、他のプラットフォームから - はい、これはの大きなの違いを作ることができます。特にスイッチの量のコードは何をする必要があり、回数は、それがストリームなどの非同期な性質を心配する必要があります。

しかし、本当のテストは、当然のことながら、それをプロファイリングすることです。なぜ両方のアプローチを使用して、任意のファイルを介して大量生産で有名基本的なアプリを書き、いくつかの一般的なファイルのためにそれをテストしていない...効果は、通常は驚くべきである、の の場合、コードはIOがバインドされています。それはメモリになると、の処理のデータファイルが小さく、アプリ実行時の大半が費やされている場合は、任意の違いに気付く可能性はありません。

まず最も簡単なます:

cin.getline(buffer,1024);
あなたが心配する必要はありませんので、

第二に、通常、すべてのIOがバッファリングされすぎ。

第三に、CGIプロセスは通常、開始、それは巨大でない限り、入力処理(その後、はるかにコスト ファイル)...だから、あなたはそれについて考えないことがあります。

やあ、

1バイトの時間でそれを行うことによって、大きなパフォーマンスヒットの一つは、あなたのコンテキストが何度もシステム時刻にユーザー時間から起こっているということです。オーバー。効率的ではない全然ます。

一つの大きな塊をつかむ、通常、MTUサイズまで、測定可能、より効率的である。

ベクターにコンテンツをスキャンし、\ nはのために外を見ては、ウェブ入力のラインにあなたの入力を分離するためにすることを反復処理しないのはなぜ?

HTH

歓声、

あなたはソケットから一度に1つのバイトを読んでいない、あなたはalreadetyからすべての入力をバッファリングしていますCGIを使用している場合、C / C ++ I / Oシステムからのatimeで1つのバイトを読んでいますソケット。バッファードI / Oの全体のポイントは、それらを処理するための便利な方法でプログラマにデータを利用できるようにすることですので、あなたは、一度に1つのバイトを処理したい場合は、先に行く。

編集の反射にあなたがCGIを実行するか、単にそれを使用している場合、それはあなたの質問から明らかではありません。あなたが現在その1バイトを読んで読む方法を示すコードスニペットを掲載することにより、これを明確にできます。

あなたが直接ソケットを読んでいるなら、あなたは、単にバッファに入るために応答全体を読む必要があり、それを処理します。これは、コーディングのパフォーマンスと使いやすさなど、多くの利点を持っています。

あなたは小さなバッファにlinittedされている場合は、同様に古典的なバッファリングアルゴリズムを使用します:

getbyte:
   if buffer is empty
      fill buffer
      set buffer pointer to start of buffer
   end
   get byte at buffer pointer
   increment pointer

あなたはのfdopen()関数でソケットファイルdescritporを開くことができます。あなたがするfgets()、またはその記述子に類似したを呼び出すことができますので、その後は、IOをバッファリングしています。

オペレーティング・システム・レベルでの違いはありません、データがとにかくバッファリングされています。アプリケーションは、しかし、一度バイト1を「読む」ために多くのコードを実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top