【问题标题】:Efficient read some bytes from DataReader?高效地从 DataReader 读取一些字节?
【发布时间】:2014-12-23 21:32:44
【问题描述】:

我有一个带有 ANSI 字符串的流。它以字节长度为前缀。如何将其读入std::string

类似:

short len = reader.readInt16();
char[] result = reader.readBytes(len); // ???
std::string str = std::copy(result, result + len);

但是没有方法readBytes(int)

附带问题:使用readByte()DataReader 一次读取一个字节会很慢吗?

【问题讨论】:

    标签: windows-phone-8 datareader c++-cx


    【解决方案1】:

    根据 MSDN,DataReader::ReadBytes 存在并且是您正在寻找的内容:http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.readbytes

    它需要一个Platform::Array<unsigned char> 作为参数,大概你会使用前缀长度进行初始化,返回时将包含你的字节。从那里开始,构建所需的std::string 是一个乏味但直接的过程。

    基本用法如下所示(抱歉,目前在 Mac 上,所以精确的语法可能有点偏差):

    auto len = reader->ReadInt16();
    auto data = ref new Platform::Array<uint8>(len);
    reader->ReadBytes(data);
    
    // now data has the bytes you need, and you can make a string with it
    

    请注意,上面的代码不是生产就绪的 - reader 肯定没有足够的数据缓冲,因此您需要 reader.LoadAsync(len) 并创建一个延续处理可用的数据。尽管如此,希望这足以让您继续前进。

    编辑

    刚刚注意到你的附带问题。简短的回答是,是的,一次读取一个字节要慢得多,因为它需要更多的工作。

    长答案:考虑每个字节的内容:

    1. 发生函数调用 - 堆栈帧分配
    2. 发生了一些从缓冲区读取字节的逻辑
    3. 函数返回 - 堆栈帧被弹出,结果被推送,控制返回
    4. 您获取字节,并将其推入std::string,偶尔会导致动态重新分配(除非您已经str.resize(len),即)

    在所有发生的事情中,动态重新分配是真正的性能杀手。话虽如此,如果你有很多字节,函数调用的工作将主导读取字节的工作。

    现在,考虑一下当您一次读取所有字节时会发生什么:

    1. 发生函数调用 - 堆栈帧,推送结果数组
    2. (在所有请求的数据都在那里的快乐路径中)从内部缓冲区到预分配数组的 memcpy
    3. 返回
    4. memcpy 插入字符串

    这当然要快得多 - 您的分配相对于读取的字节数是恒定的,函数调用的数量也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多