C# 有效地将字节[]转换为字符串

C# 有效地将字节[]转换为字符串,c#,io,C#,Io,我正在做一个爱好项目(简单/高效的数据存储)。我当前关心的是从磁盘(二进制)读取数据和填充对象的性能 我的目标是创建一个简单的存储,它针对读取性能进行了优化(针对移动设备),比从SQL数据库或CSV读取快得多 分析应用程序后,当我从磁盘(~1000条记录=240毫秒)记录中读取数据时,大部分时间都花在方法“set(byte[])”中: 进一步评论: 数据以二进制形式从磁盘读取 对于文件中的每一行,将创建一个新对象并调用函数集(row\u buffer) 将流读入row_缓冲区(使用br.Rea

我正在做一个爱好项目(简单/高效的数据存储)。我当前关心的是从磁盘(二进制)读取数据和填充对象的性能

我的目标是创建一个简单的存储,它针对读取性能进行了优化(针对移动设备),比从SQL数据库或CSV读取快得多

分析应用程序后,当我从磁盘(~1000条记录=240毫秒)记录中读取数据时,大部分时间都花在方法“set(byte[])”中:

进一步评论:

  • 数据以二进制形式从磁盘读取
  • 对于文件中的每一行,将创建一个新对象并调用函数集(row\u buffer)
  • 将流读入row_缓冲区(使用br.Read(row_缓冲区,0,RowLength[i])会占用约10%的时间
  • 将字节(GetString)转换为字符串大约占用88%的时间
->我不明白为什么创建字符串如此昂贵:(

你知道如何提高性能吗?我只限于“安全C#”代码

谢谢你的阅读

编辑


我需要创建对象来运行Linq查询。我想推迟对象创建,但在这一阶段找不到方法。请参阅我的另一个SO问题:

字符串存储在Unicode内存中,这意味着UTF8数据需要逐字节处理。如果此时不需要使用字符串,请推迟转换,直到您这样做@PeterRitchie是的,你的观点很好,我也对此进行了调查。我还有一个问题,为什么我不能推迟到以后再创建对象。我已经更新了这个问题,以包括对我的另一个问题的引用。你说的“读取行缓冲区消耗约10%的时间”是什么意思?这仅仅是复制字节数组吗?@AntonTykhyy T感谢hanks指出。我已经澄清了这个说法。我正在将一个流读入一个固定字节[]。我想表明的是IO似乎不是瓶颈。1000条记录,每条记录有多少字节?
// data layout:
// strings are stored as there UTF-8 representation in a byte array
// within a "row", the first two bytes contain the length in bytes of the string data
// my data store also supports other types (which are much faster) - not shown below.
class myObject : IRow
{
  public string Name;
  public string Title;
  // and so on
  public void set(byte[] row_buffer)
  {
     int offset = 0;
     short strLength = 0;

     // Name - variable about 40 bytes 
     strLength = BitConverter.ToInt16(row_buffer, offset);
     offset += 2;
     Name = Encoding.UTF8.GetString(row_buffer, offset, strLength);
     offset += strLength;

     // Path - variable about 150 bytes
     strLength = BitConverter.ToInt16(row_buffer, offset);
     offset += 2;
     Path = Encoding.UTF8.GetString(row_buffer, offset, strLength);
     offset += strLength;

     // and so on
  }
}