Быстрое преобразование строки в byte[]

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

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

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


person Wheeler    schedule 28.11.2013    source источник
comment
Вы а) действительно сталкиваетесь с проблемами производительности и б) уверены, что именно эта часть вызывает эти проблемы?   -  person Bart Friederichs    schedule 28.11.2013
comment
Я люблю оптимизировать код, а эта строчка самая критичная по времени по мнению профилировщика.   -  person Wheeler    schedule 28.11.2013
comment
Почему небезопасный код может помочь? Что заставляет вас думать, что этот код является узким местом? Что заставляет вас думать, что его можно улучшить? Каковы ваши требования к производительности?   -  person David Heffernan    schedule 28.11.2013
comment
GetBytes уже использует небезопасный код.   -  person Peter Ritchie    schedule 28.11.2013
comment
Во-первых, почему вы хотите его оптимизировать? Действительно ли это проблематично? И, во-вторых, не думали ли вы об оптимизации кода вместо того, чтобы пытаться ускорить наиболее часто вызываемую функцию? Возможно, вы можете делать другие вещи, такие как развертывание цикла или лучший алгоритм, который будет вызывать этот метод реже. Используйте кеширование, динамическое программирование и т.д., и т.п. Чаще всего попытка оптимизировать встроенную функцию не дает результата.   -  person Bart Friederichs    schedule 28.11.2013
comment
Если вам нужно часто использовать UTF8, может быть быстрее просто работать с массивами байтов, чем постоянно конвертировать из Unicode в UTF8.   -  person Peter Ritchie    schedule 28.11.2013
comment
Я не знаю, можно ли это улучшить, поэтому задал вопрос. Многие встроенные функции можно опередить более быстрой реализацией, такой как GDI или Crypto.   -  person Wheeler    schedule 28.11.2013
comment
Питер Ричи только что подал мне идею, спасибо, это может быть огромным улучшением!   -  person Wheeler    schedule 28.11.2013
comment
Как насчет этого подхода: stackoverflow. ком/вопросы/472906/?   -  person MarcinJuraszek    schedule 29.11.2013


Ответы (1)


Если вы не слишком заботитесь об использовании конкретной кодировки, а ваш код критичен к производительности (например, это какой-то сериализатор БД, который нужно запускать миллионы раз в секунду), попробуйте

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);
}
person MagnatLU    schedule 28.11.2013
comment
Это совершенно странно. Оптимизировать преобразование в UTF8, э-э, чем именно? - person David Heffernan; 29.11.2013
comment
Используя UTF-16 вместо UTF-8 и объяснив тот факт, что представление строки .NET во внутренней памяти уже находится в этом формате, и все, что вам нужно сделать, чтобы получить его, - это скопировать блок памяти вместо фактического преобразования строки символ за символом в желаемый кодирование. - person MagnatLU; 29.11.2013
comment
Я просто не понимаю, как это связано с вопросом, который явно и намеренно преобразуется в UTF8. Если вам нужно представление UTF16, код в вашем ответе так же бессмысленен. Просто возьмите копию ссылки на строку! Зачем вообще возиться с byte[]. И использование небезопасного кода здесь тоже кажется бессмысленным. - person David Heffernan; 29.11.2013
comment
У меня была очень похожая проблема с Уилером, и для моего проекта скорость была гораздо важнее, чем конкретная используемая кодировка (пока был также быстрый способ ее декодирования), поэтому я поделился своим мнением по этой теме. Уилер написал, что ему нужно преобразовать строку в массив байтов, и мои фрагменты кода делают именно это. Если вы не согласны с моим ответом, вы можете понизить его и предоставить свой. - person MagnatLU; 29.11.2013
comment
Я подхожу к этому с точки зрения ответа на заданный вопрос, а не решения проблемы задающего вопрос. - person David Heffernan; 29.11.2013
comment
@MagnatLU Если вас не слишком волнует использование определенной кодировки. Мой комментарий будет вам придется. Проблема с этим подходом заключается в порядке байтов. Этот код опасен, если вы хотите использовать его на разных машинах. Может быть, это работает во многих ситуациях, но это противоречит стандартам. Это, вероятно, вызывает проблемы, когда вы хотите масштабироваться. В конце концов, вы должны заботиться о кодировании. Чтобы решить проблемы с производительностью, вам лучше иметь дело с двоичными массивами. - person Ehsan88; 20.05.2017
comment
как использовать? это метод? и лен был не определен - person nyconing; 27.09.2019