快速将字符串转换为byte[]数组

8

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

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

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


2
你是否 a) 真的遇到了性能问题,b) 并且确定是这部分代码导致了这些问题? - Bart Friederichs
GetBytes 已经使用了不安全的代码。 - Peter Ritchie
首先,你为什么想要优化它?它实际上有问题吗?其次,你考虑过优化代码,而不是试图使最常调用的函数更快吗?也许你可以做其他事情,比如循环展开或更好的算法,这样就会更少地调用此方法。使用缓存、动态规划等等。往往情况下,尝试优化内置函数并不是正确的方法。 - Bart Friederichs
2
如果您需要经常使用UTF8,与其一直从Unicode转换为UTF8,使用字节数组可能会更快。 - Peter Ritchie
我不知道这是否可以改进,这就是为什么我问这个问题。许多内置函数可以被更快的实现所超越,例如GDI或Crypto。 - Wheeler
显示剩余4条评论
1个回答

14

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

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

编辑: Marshal.Copy 的速度大约比 UTF8.GetBytes 快十倍,同时它可以获得 UTF-16 编码。如果需要将其转换回字符串,则可以使用以下方法:

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

这太奇怪了。通过什么方式来优化转换为UTF8呢? - David Heffernan
通过使用UTF-16而不是UTF-8,并利用事实,即.NET字符串的内部内存表示已经采用了该格式,您所需要做的就是复制内存块,而不是逐个字符地将字符串转换为所需的编码。 - MagnatLU
我只是看不出它与明显且故意转换为UTF8的问题有什么关系。如果你想要一个UTF16表示,那么你答案中的代码也同样毫无意义。只需复制字符串引用即可!为什么还要费心使用byte[]呢?而且在这里使用不安全代码似乎也没有意义。 - David Heffernan
7
我遇到了与Wheeler非常相似的问题,对于我的项目来说速度比使用特定编码更加重要(只要有快速解码的方法),因此我分享了我的看法。 Wheeler写道他需要将字符串转换为字节数组,我的代码片段正好可以做到这一点。如果您不同意我的答案,可以自由地将其投票否决并提供您自己的答案。 - MagnatLU
我从回答问题的角度来看待这个问题,而不是解决提问者所遇到的问题。 - David Heffernan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接