【问题标题】:Fast string to byte[] conversion快速字符串到字节 [] 的转换
【发布时间】:2013-12-14 22:19:03
【问题描述】:

目前我正在使用此代码将字符串转换为字节数组:

var tempByte = System.Text.Encoding.UTF8.GetBytes(tempText);

我在我的应用程序中经常调用此行,我真的想使用更快的行。如何比默认的 GetBytes 方法更快地将字符串转换为字节数组?也许有不安全的代码?

【问题讨论】:

  • 您是不是 a) 确实遇到了性能问题 b) 确定是这部分导致了这些问题?
  • 我喜欢优化代码,根据profiler,这一行在时间上是最关键的。
  • 为什么不安全的代码会有帮助?是什么让你认为这段代码是一个瓶颈?是什么让您认为它可以改进?您的性能要求是什么?
  • GetBytes 确实已经使用了不安全的代码。
  • 如果您需要大量使用 UTF8,那么简单地使用字节数组而不是一直从 Unicode 转换为 UTF8 可能会更快。

标签: c# string performance byte


【解决方案1】:

如果您不太关心使用特定编码并且您的代码对性能至关重要(例如,它是某种 DB 序列化程序,需要每秒运行数百万次),请尝试

fixed (void* ptr = tempText)
{
    System.Runtime.InteropServices.Marshal.Copy(new IntPtr(ptr), tempByte, 0, len);
}

编辑Marshal.CopyUTF8.GetBytes 快十倍左右,并为您提供 UTF-16 编码。要将其转换回字符串,您可以使用:

fixed (byte* bptr = tempByte)
{
    char* cptr = (char*)(bptr + offset);
    tempText = new string(cptr, 0, len / 2);
}

【讨论】:

  • 这太奇怪了。优化转换为 UTF8,呃,究竟是什么?
  • 通过使用 UTF-16 而不是 UTF-8 并解释事实,.NET 字符串的内部内存表示已经是这种格式,您需要做的就是复制内存块而不是实际上将字符串逐个字符转换为所需的编码。
  • 我只是看不出它与清楚且故意转换为 UTF8 的问题有何关系。如果您想要 UTF16 表示,那么您答案中的代码同样毫无意义。只需复制字符串参考!为什么还要打扰 byte[]。而且在这里使用不安全的代码似乎也毫无意义。
  • 我对 Wheeler 有一个非常相似的问题,对于我的项目来说,速度比使用的特定编码更重要(只要有快速解码的方法),所以我对此分享了我的看法话题。 Wheeler 写道,他需要将字符串转换为字节数组,而我的代码 sn-ps 就是这样做的。如果您不同意我的回答,您可以随意投反对票并提供您的回答。
  • 我是从回答提出的问题的角度来解决这个问题的,而不是解决提问者的问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2015-06-19
  • 2021-08-23
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多