2010-12-08 12 views
4

これは全く新しい質問ですが、私はGoogle/SO/Etcを通じて信頼性の高い回答は見つかりませんでした。バッファ(Node.js)のコンテンツで.replace()を実行していますか?

バッファにコンテンツがある場合、そのコンテンツに.replace()を実行するための最良のパターンは何ですか?

.toString()で内容を取り出し、replace()を実行してから、バッファに戻しますか?それとも良い方法がありますか?

+0

@Gabyありがとう。私は通常そうする。急いで、今日の午後。 :) – Spot

答えて

3

を交換したいものに依存

おかげで、Buffersは彼らに自己を再配分していない、あなたはJavaScriptで持っているBufferオブジェクトは、単に外部メモリ領域への「ポインタ」である(私は具体的には、約話してNode.js 3.xここでは、2.xの古い "SlowBuffers"は別の方法で動作します)。

ので、2つの可能なシナリオがあります。

  1. あなたの置換値の長さが<>置き換えられていた値です。この場合、多くのことができません。新しいString(ヒント:遅い)を割り当て、その文字列のサイズに基づいて新しいBufferを作成するtoString()を使用する必要があります。

  2. あなたはちょうどここでそれは道速くなりますは単なるループを使用する2.xの上で速くなり、交換あなたを実行することになり(バッファ上の[]ない文字インデックスである)バイトをスワップしています割り当てのオーバーヘッドはほとんどありません(ノードは書き込まれたものと同じ値で新しいintを割り当てます)。しかし、3.x toStringは99%の時間で問題ありません。それは2.xの下に遅い本当にですので、あなたは、ソケットに巨大な文字列を書き込まないことを

しかし、あなたが本当に気をつけたいです、
V8はいつでもメモリ内の文字列を移動できるため、ノード2.xはポインタをOSに渡す前にそれらをコピーする必要があります。これは、3.xでV8のいくつかのハックで修正されています。

+0

実際には、これを本番環境で使用しています。だから我々はまだ2.xになっている – Spot

+0

その後、 'toString()'バージョンの方が遅くなります。なぜなら、その後のバッファ割り当てはさらに長くなり、ノード3.xのバッファは2.xの10倍高速です。もしあなたが '[] 'アプローチで行くことができれば。しかし、結局のところ、これはパフォーマンスに重大な影響を与えるかどうかにかかっています。要求ごとに2000xを実行しない限り、影響はありません。また、実際のボトルネックは、カーネルが安全に読むことができるようにコピーアウトする必要があるため、文字列を2.xのソケットに書き込むときです。 V8はそれらを動かす可能性があり、そのためポインタを無効にすることができます。 –

関連する問題