2011-06-25 13 views
0

私はファイルをbyte[] bufferに読み込んでいます。ファイルには、次の形式でUTF-16文字列(百万人)の多くが含まれていますC#はUTF-16バイト配列で文字列演算を実行します

  • 最初のバイト含まれており、文字の文字列の長さ(範囲0 .. 255)
  • 、次のバイトは、文字列の文字が含まれていますUTF-16エンコーディング(各文字は2バイトで表され、byteCount = charCount * 2を意味します)。

私は、たとえば、ファイル内のすべての文字列のための標準的な文字列操作を実行する必要があります。IndexOfEndsWithStartsWithStringComparison.OrdinalIgnoreCaseStringComparison.Ordinalと。

今のところ私のコードは、バイト列から各文字列をSystem.String型に変換しています。私は、次のコードは、そうするのが最も効率的であることが判明:

// position/length validation removed to minimize the code 

string result; 
byte charLength = _buffer[_bufferI++]; 
int byteLength = charLength * 2; 

fixed (byte* pBuffer = &_buffer[_bufferI]) 
{ 
    result = new string((char*)pBuffer, 0, charLength); 
} 

_bufferI += byteLength; 
return result; 

それでも、new string(char*, int, int)それは、各文字列ため不要コピーを実行するので、それは非常に遅いです。

Profilerは、System.String.wstrcpy(char*,char*,int32)が遅いとしています。

の文字列ごとにバイトをコピーせずに、文字列操作を実行する方法が必要です。

バイト配列に文字列演算を直接行う方法はありますか?

新しい文字列を作成する方法はありますか?のバイトはコピーされていませんか?

+0

すべての文字がUTF16の2バイトにエンコードされるわけではありません。 –

+0

@Kerrek SB:そうですが、それらの文字は文字列に複数の 'char'値としても格納されます。 – Guffa

+0

@Kerrek SBあなたはコードポイントについて話しています。Microsoftの用語では、文字は2バイトです。 –

答えて

2

いいえ、文字データをコピーせずに文字列を作成することはできません。

Stringオブジェクトは、文字列(Length、et.c)のメタデータを文字データと同じメモリ領域に格納するため、文字データをバイト配列に保持して、それをaというふりをすることはできませんStringオブジェクトです。

バイトデータから文字列を構成する他の方法を試してみて、いずれの文字列にもEncoding.UTF16.GetStringのようなオーバーヘッドが少ないかどうか確認できます。

ポインタを使用している場合は、一度に複数の文字列を取得しようとするので、各文字列のバッファを修正する必要はありません。あなたが間にある「バイトのオーバーヘッドが」持っていないので、あなたがEncoding.UTF16を使用してのStreamReaderを使用してファイルを読むことができる

0

using (StreamReader sr = new StreamReader(filename, Encoding.UTF16)) 
{ 
    string line; 

    while ((line = sr.ReadLine()) != null) 
    { 
     //Your Code 
    } 
} 
+0

'StreamReader'はバッファをコピーしているシーンの裏側にあります(リフレクターで見た)。 – DxCK

+0

@DxCK - 常にバッファコピーがあります。実際にこれを試しましたか? –

0

をあなたは、これらの文字列のほとんどを処理するためにバイト配列に拡張メソッドを作成することができますバイト配列上で直接操作を行い、変換コストを回避します。実行するすべての文字列操作がわからないため、すべての文字列操作がこのように実行できるかどうかは不明です。

+0

このようにOrdinalIgnoreCaseを実装するにはどうすればよいですか? – DxCK

+0

Hmm。良い質問。それは、おそらくあなたが文字に各バイトを変換し、それらを比較する必要があります。これは、比較演算を行うために必要な文字数を変換するだけで、入力のセットが他のものよりも小さいか大きいかを見つける必要があるため、すべてのアイテムを文字列に変換するよりも早くなる可能性があります。 –

関連する問題