node.jsで複数のBufferを連結する方法
node.jsで複数のBufferを連結させたい場合、
var b1 = new Buffer(1024);
var b2 = new Buffer(1024);
b1 + b2;
のような安直な形で実行しようとしても当然のようにうまく行かない。
b3 = new Buffer(b1.length, b2.length);
b1.copy(b3);
b2.copy(b3, b1.length);
のようにして解決できることはできるが、新規にBufferを生成していたり、Buffer.prototype.copyを二箇所で実行している都合上、連結したいBufferの数が増えれば増えるほど速度が遅くなってしまう。なので配列を入れた変数buffersに連結したいBufferを入れ、変数lengthに各Bufferの長さを足した数を入れた上で、
var buffer = buffers.reduceRight(function(previousBuffer, currentBuffer) {
length -= currentBuffer.length;
currentBuffer.copy(previousBuffer, length);
return previousBuffer;
}, new Buffer(length));
としてみるようにした。変数lengthを用意しておかなければならないのがあまり良くないようにおもえるので、ほかの方法を見つけたい。
簡単に速度差を測ってみたところだいぶ差が出る。とはいえ一万回の施行でも1000ミリ秒を超えることは稀なのでそこまで気にすることでもないのかもしれない。


