当前位置: 首页 > 面试题库 >

缓冲区与字符串速度:为什么字符串更快?

公英哲
2023-03-14
问题内容

我有一个名为Memcached.Js的项目,它是Memcached服务器到Node.js的端口。

我一直在使用字符串和缓冲区进行比较,比较内存占用量和性能。对于内存,毫无疑问,缓冲区是正确的选择。

但令我惊讶的是,表演并非如此。执行字符串操作比使用缓冲区更快。这是我尝试的:

// 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

测试表明,字符串比Buffer更快。由于这不是我所期望的,因此我认为我可能做错了什么,但我找不到确切的意思。

有人能帮我一下吗?

Tks!


问题答案:

字符串是V8内置的,并在VM中分配内存。添加缓冲区不是为了使所有字符串操作更快,而是代表二进制数据,其中字符串是unicode。

将大量数据写入套接字时,以二进制格式存储数据要比从Unicode转换要高效得多。

因此,对于诸如concat之类的常见操作,我并不惊讶字符串速度更快。



 类似资料:
  • 协议缓冲区说它可以包含任何任意的字节序列。但是如果我的数据包含“\0”,协议缓冲区如何从字符串变量对我的整个数据进行编码。

  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 我在游标循环中连接varchar2数据类型时遇到了问题。 过程在循环中迭代,以生成用于批处理的插入和删除操作的in子句。该过程将对每1000个帐号批处理运行。 有没有其他方法可以做到这一点?

  • 问题内容: 我想使用node.js进行HTTP请求以从Web服务器加载一些文本。由于响应可能包含很多文本(有些兆字节),因此我想分别处理每个文本块。我可以使用以下代码来实现: 这似乎没有问题。但是我想支持HTTP压缩,所以我使用zlib: 这可以是像多字节字符的问题,其由两个字节组成:和。如果第一个字节被第一个块()覆盖,第二个字节被第二个块覆盖,则将在文本块的结尾/开头产生不正确的字符。如何避免

  • 问题内容: 我正在使用一个返回字节字符串的库,我需要将其转换为字符串。 尽管我不确定有什么区别-如果有的话。 问题答案: 假设使用Python 3(在Python 2中,这种区别的定义不太明确)-字符串是字符序列,即unicode码点;这些是一个抽象概念,不能直接存储在磁盘上。毫无疑问,字节字符串是字节的序列- 可以 存储在磁盘上的东西。它们之间的映射是一种 编码 -其中有很多(并且无限可能)-并

  • 用这种方式将字节缓冲符转换为字符串是否正确, 我问这个问题的原因是,这看起来太简单了,而像Java这样的其他方法:将字符串转换成字节缓冲符和相关问题看起来更复杂。