2013-11-28 17 views
6

byte: Hızlı dize Şu anda bayt dizisine dize dönüştürmek için bu kodu kullanıyorum [] dönüşüm

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

benim uygulamada çok sık bu hattını arayın ve gerçekten daha hızlı bir kullanmak istiyorum. Bir dizeyi varsayılan GetBytes yönteminden daha hızlı bir bayt dizisine nasıl dönüştürebilirim? Belki güvenli olmayan bir kodla? Belirli kodlamayı kullanarak hakkında çok fazla umurumda değil ve kod performansı açısından kritik ise

+2

a) Aslında performans sorunları ile karşılaşıyor musunuz ve b) bu ​​sorunlara neden olan bu bölüm olduğundan emin misiniz? –

+0

Kodu optimize etmeyi seviyorum ve bu satır, profiler'e göre zaman içinde en kritik olanıdır. – Wheeler

+0

Güvenli olmayan kod neden yardımcı olur? Bu kodun bir darboğaz olduğunu düşündüren nedir? Geliştirilebileceğini düşündüren nedir? Performans gereksinimleriniz nelerdir? –

cevap

8

(örneğin o DB serileştiriciden çeşit ve saniyede milyonlarca kez çalıştırılması gerekiyor) denemek

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

Düzenleme: Marshal.Copy, UTF8.GetBytes'dan on kat daha hızlıydı ve size UTF-16 kodlaması getiriyor. Geri yüklemek için aşağıdakileri kullanabilirsiniz:

+0

Bu tamamen tuhaf. Tam olarak ne UTF8'e dönüştürmeyi optimize edin? –

+0

UTF-8 yerine UTF-16 kullanarak ve gerçekleri açıklayarak, .NET dizesinin bu dahili bellek gösterimi zaten bu formatta ve bunu elde etmek için yapmanız gereken tek şey gerçekten karakter dizesi karakterine dönüştürmek yerine, bellek bloğu kopyalamaktır. istenen kodlama. – MagnatLU

+0

Sadece açıkça ve kasten UTF8'e dönüşen soruyla nasıl bir ilişki olduğunu göremiyorum. Eğer bir UTF16 gösterimi istiyorsanız, cevabınızdaki kod sadece anlamsızdır. Sadece dize referansının bir kopyasını alın! Neden bile byte ile rahatsız []. Ve burada güvenli olmayan kod kullanımı da anlamsız gibi görünüyor. –

İlgili konular