2013-11-28 3 views
6

В настоящее время я использую этот код для преобразования строки в массив байтов:Быстрая строка байт [] преобразование

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

Я называю эту линию очень часто в моем приложении, и я очень хочу, чтобы использовать более быстрый один. Как преобразовать строку в массив байтов быстрее, чем метод GetBytes по умолчанию? Может быть, с небезопасным кодом?

+2

Вы действительно работаете в проблемах с производительностью и б) уверены, что именно эта часть вызывает эти проблемы? –

+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, er, что именно? –

+0

Используя UTF-16 вместо UTF-8 и раскрывая факт, это представление внутренней памяти строки .NET уже находится в этом формате, и все, что вам нужно сделать, это скопировать блок памяти вместо фактического преобразования символа строки по символу в требуемое кодирование. – MagnatLU

+0

Я просто не вижу, как это относится к вопросу, который четко и намеренно преобразуется в UTF8. Если вы хотите представление UTF16, то код в вашем ответе будет таким же бессмысленным. Просто возьмите копию ссылки на строку! Зачем даже беспокоить байт []. И использование небезопасного кода здесь также кажется бессмысленным. –

Смежные вопросы