2013-11-28 145 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 []。這裏使用不安全的代碼似乎也毫無意義。 –

相關問題