これは全く新しい質問ですが、私はGoogle/SO/Etcを通じて信頼性の高い回答は見つかりませんでした。バッファ(Node.js)のコンテンツで.replace()を実行していますか?
バッファにコンテンツがある場合、そのコンテンツに.replace()
を実行するための最良のパターンは何ですか?
.toString()
で内容を取り出し、replace()
を実行してから、バッファに戻しますか?それとも良い方法がありますか?
これは全く新しい質問ですが、私はGoogle/SO/Etcを通じて信頼性の高い回答は見つかりませんでした。バッファ(Node.js)のコンテンツで.replace()を実行していますか?
バッファにコンテンツがある場合、そのコンテンツに.replace()
を実行するための最良のパターンは何ですか?
.toString()
で内容を取り出し、replace()
を実行してから、バッファに戻しますか?それとも良い方法がありますか?
を交換したいものに依存
おかげで、Buffers
は彼らに自己を再配分していない、あなたはJavaScriptで持っているBuffer
オブジェクトは、単に外部メモリ領域への「ポインタ」である(私は具体的には、約話してNode.js 3.xここでは、2.xの古い "SlowBuffers"は別の方法で動作します)。
ので、2つの可能なシナリオがあります。
あなたの置換値の長さが<>
置き換えられていた値です。この場合、多くのことができません。新しいString
(ヒント:遅い)を割り当て、その文字列のサイズに基づいて新しいBuffer
を作成するtoString()
を使用する必要があります。
あなたはちょうどここでそれは道速くなりますは単なるループを使用する2.xの上で速くなり、交換あなたを実行することになり(バッファ上の[]
がない文字インデックスである)バイトをスワップしています割り当てのオーバーヘッドはほとんどありません(ノードは書き込まれたものと同じ値で新しいintを割り当てます)。しかし、3.x toString
は99%の時間で問題ありません。それは2.xの下に遅い本当にですので、あなたは、ソケットに巨大な文字列を書き込まないことを
しかし、あなたが本当に気をつけたいです、
V8はいつでもメモリ内の文字列を移動できるため、ノード2.xはポインタをOSに渡す前にそれらをコピーする必要があります。これは、3.xでV8のいくつかのハックで修正されています。
実際には、これを本番環境で使用しています。だから我々はまだ2.xになっている – Spot
その後、 'toString()'バージョンの方が遅くなります。なぜなら、その後のバッファ割り当てはさらに長くなり、ノード3.xのバッファは2.xの10倍高速です。もしあなたが '[] 'アプローチで行くことができれば。しかし、結局のところ、これはパフォーマンスに重大な影響を与えるかどうかにかかっています。要求ごとに2000xを実行しない限り、影響はありません。また、実際のボトルネックは、カーネルが安全に読むことができるようにコピーアウトする必要があるため、文字列を2.xのソケットに書き込むときです。 V8はそれらを動かす可能性があり、そのためポインタを無効にすることができます。 –
@Gabyありがとう。私は通常そうする。急いで、今日の午後。 :) – Spot