Konversi string ke byte[] yang cepat

Saat ini saya menggunakan kode ini untuk mengonversi string ke array byte:

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

Saya sangat sering memanggil saluran ini di aplikasi saya, dan saya sangat ingin menggunakan yang lebih cepat. Bagaimana saya bisa mengonversi string menjadi array byte lebih cepat daripada metode GetBytes default? Mungkin dengan kode yang tidak aman?


person Wheeler    schedule 28.11.2013    source sumber
comment
Apakah Anda a) benar-benar mengalami masalah kinerja dan b) yakin bagian inilah yang menyebabkan masalah tersebut?   -  person Bart Friederichs    schedule 28.11.2013
comment
Saya suka mengoptimalkan kode, dan baris ini adalah baris paling kritis menurut profiler.   -  person Wheeler    schedule 28.11.2013
comment
Mengapa kode yang tidak aman bisa membantu? Apa yang membuat Anda berpikir kode ini merupakan hambatan? Apa yang membuat Anda berpikir hal ini dapat ditingkatkan? Apa persyaratan kinerja Anda?   -  person David Heffernan    schedule 28.11.2013
comment
GetBytes apakah sudah menggunakan kode yang tidak aman.   -  person Peter Ritchie    schedule 28.11.2013
comment
Pertama, mengapa Anda ingin mengoptimalkannya? Apakah ini benar-benar bermasalah? Dan kedua, sudahkah Anda mempertimbangkan untuk mengoptimalkan kode, daripada mencoba membuat fungsi yang paling sering dipanggil menjadi lebih cepat? Mungkin Anda dapat melakukan hal lain seperti loop unrolling atau algoritma yang lebih baik yang akan lebih jarang memanggil metode ini. Gunakan caching, pemrograman dinamis, dll. Seringkali, mencoba mengoptimalkan fungsi bawaan bukanlah cara yang tepat.   -  person Bart Friederichs    schedule 28.11.2013
comment
Jika Anda harus sering menggunakan UTF8, mungkin akan lebih cepat jika bekerja dengan array byte daripada terus-menerus mengonversi dari Unicode ke UTF8.   -  person Peter Ritchie    schedule 28.11.2013
comment
Saya tidak tahu apakah ini dapat diperbaiki, itulah mengapa saya mengajukan pertanyaan. Banyak fungsi bawaan yang bisa dikalahkan dengan implementasi yang lebih cepat, seperti GDI atau Crypto.   -  person Wheeler    schedule 28.11.2013
comment
Peter Ritchie baru saja memberi saya ide, terima kasih, ini bisa menjadi kemajuan besar!   -  person Wheeler    schedule 28.11.2013
comment
Bagaimana dengan pendekatan itu: stackoverflow. com/questions/472906/?   -  person MarcinJuraszek    schedule 29.11.2013


Jawaban (1)


Jika Anda tidak terlalu peduli tentang penggunaan pengkodean tertentu dan kode Anda sangat penting bagi kinerja (misalnya semacam serializer DB dan perlu dijalankan jutaan kali per detik), coba

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

Edit: Marshal.Copy sekitar sepuluh kali lebih cepat dari UTF8.GetBytes dan memberi Anda pengkodean UTF-16. Untuk mengonversinya kembali menjadi string, Anda dapat menggunakan:

fixed (byte* bptr = tempByte)
{
    char* cptr = (char*)(bptr + offset);
    tempText = new string(cptr, 0, len / 2);
}
person MagnatLU    schedule 28.11.2013
comment
Ini sungguh aneh. Optimalkan konversi ke UTF8 dengan, eh, apa sebenarnya? - person David Heffernan; 29.11.2013
comment
Dengan menggunakan UTF-16 alih-alih UTF-8 dan menjelaskan fakta, representasi memori internal string .NET sudah dalam format itu dan yang perlu Anda lakukan untuk mendapatkannya hanyalah menyalin blok memori alih-alih benar-benar mengonversi karakter string demi karakter ke yang diinginkan pengkodean. - person MagnatLU; 29.11.2013
comment
Saya tidak bisa melihat kaitannya dengan pertanyaan yang dengan jelas dan sengaja diubah menjadi UTF8. Jika Anda menginginkan representasi UTF16 maka kode dalam jawaban Anda tidak ada gunanya. Ambil saja salinan referensi stringnya! Mengapa repot-repot dengan byte[]. Dan penggunaan kode yang tidak aman di sini sepertinya juga tidak ada gunanya. - person David Heffernan; 29.11.2013
comment
Saya memiliki masalah yang sangat mirip dengan Wheeler dan untuk kecepatan proyek saya jauh lebih penting daripada pengkodean tertentu yang digunakan (selama ada cara cepat untuk memecahkan kodenya juga), jadi saya membagikan pendapat saya tentang topik ini. Wheeler menulis dia perlu mengubah string menjadi array byte dan cuplikan kode saya melakukan hal itu. Jika Anda tidak setuju dengan jawaban saya, Anda bebas untuk memberi suara negatif dan memberikan jawaban Anda. - person MagnatLU; 29.11.2013
comment
Saya membahas hal ini dari sudut pandang menjawab pertanyaan yang diajukan, bukan menyelesaikan masalah yang ditanyakan. - person David Heffernan; 29.11.2013
comment
@MagnatLU Jika Anda tidak terlalu peduli tentang penggunaan pengkodean tertentu. Komentar saya adalah Anda harus melakukannya. Masalah dengan pendekatan ini adalah endianness. Kode ini berbahaya jika Anda ingin menggunakannya pada mesin yang berbeda. Mungkin ini berhasil dalam banyak situasi, namun bertentangan dengan standar. Ini mungkin menyebabkan masalah saat Anda ingin melakukan penskalaan. Anda harus peduli dengan pengkodean. Untuk mengatasi masalah kinerja, Anda sebaiknya menggunakan array biner. - person Ehsan88; 20.05.2017
comment
Cara Penggunaan? apakah itu sebuah metode? dan len tidak terdefinisi - person nyconing; 27.09.2019