在Buffer(Node.js)内容上执行.replace()?

这是一个相当新的问题,但我还没有通过Google / SO / Etcfind任何可靠的答案。

如果您的缓冲区中有内容,那么在该内容上运行.replace()的最佳模式是什么?

你只需用.toString()取出内容,运行replace() ,然后把它放回Buffer? 或者,还有更好的方法?

谢谢

取决于你想要replace什么, Buffers不会自己重新分配它们,你在JavaScript中使用的Buffer对象只是一个到外部存储器区域的“指针”(我在这里专门讲述Node.js 3.x, 2.x中的旧“SlowBuffers”以不同的方式工作)。

所以有两种可能的情况:

  1. 您的replace值的长度是<>被replace的值。 在这种情况下,你可以做的事情不多,你需要使用toString()来分配一个新的String (提示:slow),然后根据该string的大小创build一个新的Buffer

  2. 你只是交换字节( []上的缓冲区不是一个字符索引)在这里它会快得多的速度会更快2.x只是使用一个纯循环,并执行replace你的自我,因为几乎没有分配开销(节点分配一个新的int值与写入的值相同),但是3.x toString在99%的时间内没有问题。

但是你真正想要注意的是,你不要写巨大的string,因为在2.x下它真的很慢。
由于V8可以随时移动内存中的string,因此Node 2.x需要在将指针传递给操作系统之前将其复制出来。 这已经修复了一些V8在3.x中的黑客。