การแปลงสตริงเป็นไบต์[]อย่างรวดเร็ว

ขณะนี้ฉันกำลังใช้รหัสนี้เพื่อแปลงสตริงเป็นอาร์เรย์ไบต์:

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
Peter Ritchie เพิ่งให้แนวคิดแก่ฉัน ขอบคุณ มันสามารถปรับปรุงได้มาก!   -  person Wheeler    schedule 28.11.2013
comment
วิธีการดังกล่าว: stackoverflow. com/questions/472906/?   -  person MarcinJuraszek    schedule 29.11.2013


คำตอบ (1)


หากคุณไม่สนใจมากเกินไปเกี่ยวกับการใช้การเข้ารหัสเฉพาะและโค้ดของคุณมีความสำคัญต่อประสิทธิภาพ (เช่น เป็น DB serializer บางประเภทและจำเป็นต้องรันหลายล้านครั้งต่อวินาที) ให้ลอง

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 โค้ดในคำตอบของคุณก็ไม่มีจุดหมายเช่นกัน เพียงคัดลอกการอ้างอิงสตริง! ทำไมต้องกังวลกับไบต์[] และการใช้รหัสที่ไม่ปลอดภัยที่นี่ก็ดูไร้จุดหมายเช่นกัน - person David Heffernan; 29.11.2013
comment
ฉันมีปัญหาคล้ายกันมากกับ Wheeler และความเร็วของโปรเจ็กต์ของฉันมีความสำคัญมากกว่าการเข้ารหัสที่ใช้โดยเฉพาะ (ตราบใดที่มีวิธีถอดรหัสที่รวดเร็วเช่นกัน) ดังนั้นฉันจึงแบ่งปันความคิดเห็นของฉันในหัวข้อนี้ Wheeler เขียนว่าเขาต้องแปลงสตริงเป็นอาร์เรย์ไบต์ และข้อมูลโค้ดของฉันก็ทำเช่นนั้น หากคุณไม่เห็นด้วยกับคำตอบของฉัน คุณสามารถลงคะแนนและระบุคำตอบของคุณได้อย่างอิสระ - 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