2013-11-28 98 views
6

目前我使用这个代码将字符串转换为字节数组:快速字符串为byte []转换

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

我经常叫我的应用程序这行,我真的想用一个快一些。如何将字符串转换为比默认的GetBytes方法更快的字节数组?也许有不安全的代码?

+2

您是否真的遇到了性能问题,以及b)确定这是导致这些问题的部分? –

+0

我喜欢优化代码,根据分析器,这条线是最关键的。 – Wheeler

+0

为什么不安全的代码会有帮助?是什么让你认为这个代码是一个瓶颈?是什么让你觉得它可以改进?你的性能要求是什么? –

回答

8

如果你没有太在意使用特定的编码和你的代码是性能关键(比如它的某种DB串的,需要运行每秒百万次),尝试

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); 
} 
+0

这是非常奇怪的。优化转换为UTF8,呃,究竟是什么? –

+0

通过使用UTF-16而不是UTF-8并解释事实,.NET字符串的内部内存表示形式已经是该格式,并且您只需要复制内存块而不是实际上将字符串逐字符地转换为所需的编码。 – MagnatLU

+0

我只是不明白它是如何与明确而刻意转换为UTF8的问题相关的。如果你想要一个UTF16表示,那么你的答案中的代码是毫无意义的。只需拿一个字符串参考的副本!为什么甚至会打扰byte []。这里使用不安全的代码似乎也毫无意义。 –

相关问题