2011-02-04 4 views
16

私はMemcached.Jsと呼ばれるこのプロジェクトを持っています。これはNode.jsへのMemcachedサーバーのポートです。バッファーと文字列の速度:なぜ文字列が高速になりますか?

私は、メモリフットプリントとパフォーマンスを比較して、文字列とバッファでarroundを再生しています。メモリの場合、バッファが正しい選択であるということは疑いありません。

私の驚きのために、同じことがパフォーマンスに関しては当てはまりません。バッファを使用するよりも文字列操作を実行する方が高速です。これは私が試したものです:

// Option 1: data.toString() - amazing, but it's the best one 
var commandDataStr = mdata.data.toString().substr(startPos, bytes); 
var commandData = new Buffer(commandDataStr); 

// Option 2: data.slice().toString() - the same as above... What? 
var commandDataStr = mdata.data.slice(startPos, startPos + bytes).toString(); 
var commandData = new Buffer(commandDataStr); 

// Option 3: data.slice() - bad 
var commandData = mdata.data.slice(startPos, startPos + bytes); 

// Option 4: data.copy() - bad as well 
var commandData = new Buffer(bytes); 
mdata.data.copy(commandData, 0, startPos, startPos + bytes); 

完全なコードここにある: https://github.com/dalssoft/memcached.js/blob/master/lib/memcached.ascii.commands.js#L72

テストコード:ruby test/from_clients/perf_test.rb

テストは、文字列がバッファよりも高速であることを示しました。それは私が期待していたものではないので、私はおそらく何か間違っていると思いますが、それが何であるかを正確に見つけることはできません。

誰でも私を助けることができますか?

Tks!

+0

あなたは小さなテストケースとスピードの挙動を再現することはできますか?もしそうなら、バグレポートを送ってください。 – btilly

+0

私はこのスクリプトを使用してパフォーマンスをチェックしています:https://github.com/dalssoft/memcached.js/blob/master/test/from_clients/perf_test.rb –

答えて

21

ストリングはV8に組み込まれており、VM内でメモリを割り当てます。バッファは、すべての文字列演算を高速にするのではなく、バイナリデータを表現するために追加されました。ここで、文字列はUnicodeです。

大量のデータをソケットに書き込むときは、そのデータをバイナリ形式にする方が効率的です。つまり、ユニコードから変換する必要があります。

したがって、コンカットのような一般的な操作では、私は驚くことではありません。文字列は高速です。

13

Buffer.sliceはノードが高価です。

buffer.slice(start, end).toString(encoding) 

パターンよりも10倍遅かった:パターンがあること私を見つけたスライスが任意の新しいバッファを割り当てていないにもかかわらず

buffer.toString(encoding, start, end) 

、大きなコストが発生するようです。コードの大雑把な見方から、私の推測では、外部に割り当てられたバッファを(SetIndexedPropertiesToExternalArrayDataを介して)v8に公開すると、バッファオブジェクトの生成コードを更新する必要があります。

バッファが作成(またはスライス)されると、バッファは高速に見えます。したがって、たくさんの小さなものの代わりに大きなバッファを作成し、可能なときに再利用することは、パフォーマンスのための合理的な戦略のようです。この上

もっと思考:http://geochap.wordpress.com/2011/05/03/node-buffers/

関連する問題