2011-01-28 3 views
1

私は1〜6バイトの配列をint(short-long)値に変換する必要があるバイナリファイルコンバータを作成しています。現時点では、次の3つの機能を使用していますが、パフォーマンスを向上させる方法はありますか?byte []をintに変換する際のパフォーマンスをどのように改善できますか?

private string byteToShortParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[2]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt16(workingSet, 0).ToString()); 
} 

private string byteToIntParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[4]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt32(workingSet, 0).ToString()); 
} 

private string byteToLongParse(byte[] recordData, int offset, int length) 
{ 
    byte[] workingSet = new byte[8]; 
    Buffer.BlockCopy(recordData, offset, workingSet, 0, length); 
    return (BitConverter.ToInt32(workingSet, 0).ToString()); 
} 
+0

もしあなたがバイトを扱っているのであれば、それほど多くの最適化をする必要はありません。 – BoltClock

+0

はいrecordDataはbytearrayです – Asha

+1

これはcodereview.stackexchange.comの良い質問です –

答えて

1

EDIT2:

private string bytesToIntParse(byte[] recordData, int offset, int length) 
{ 
    long result = 0; 
    for (int i = 0; i < length; ++i) 
    { 
     result |= ((long)recordData[i + offset]) << (i * 8); 
    } 
    return result.ToString(); 
} 

私はあなたがint型に変換する必要があるバイトの数は(奇妙に思えるん)可変長であれば、私はこのようにそれをやってお勧めと仮定

ひとつの機能があり、Buffer.BlockCopyはなく、任意の長さに対応しています。

EDIT1:

次のような危険なコードを使用することができます。

// I don't think you need to specify a length parameter, since int32 is always 4 bytes 
private string byteToIntParse(byte[] recordData, int offset, int length) 
{ 
    unsafe 
    { 
     fixed (byte* p = &recordData[offset]) 
     { 
      // This result will differ on little and big endian architectures. 
      return (*(int*)p).ToString(); 
     } 
    } 
} 

しかし、これはBitConverterが内部的に何をするかであるので、私はあなたがどんなパフォーマンスを獲得するとは思わない

なぜバイトをworkingSetにコピーしていますか?あなただけの可能性:

return BitConverter.ToInt32(recordData, offset).ToString()

私はあなたが毎回Buffer.BlockCopyを呼び出す必要はありませんので、それはパフォーマンスの向上が得られ推測:P

+0

私はbitconverterがそれを処理できないときに私は3バイトのようなバイト(長さ)の任意の数を持っている可能性があり、私は4バイトを送信する必要があります、それはなぜ私は長さとworkingsetを使用しています。 – Asha

+0

私の答えを編集しました – Marlon

+0

ポインタとアラインメントに注意してください... – Mehrdad

1

はい、最適な変異体は

private string byteToShortParse(byte[] recordData, int offset, int length) 
    { 
     if (length == 2) 
     { 
      short i = (recordData[offset + 1] << 8) | recordData[offset]; 
      return i.ToString; 
     } else return ""; 

    } 
だろう

同じことが4バイトと8バイトの値に適用されます(ちょうどシフトが必要です)。

+0

しかし、私は私のコメントでMarlonの答えで説明したように、私はちょうど1バイトまたは3バイトまたは7バイトを変換する必要があるかもしれません!!だから私は長さとworkingsetを使用する必要があります – Asha

+0

@Asha(a) "私は私のコメントで説明した"このサイトの仕組みではありません。質問に追加するものがある場合は、編集して質問に追加します。 (b)と何が共通のサイズのためのショートカットメソッドのセットを作成するのを止め、まれなケースのための一般的な(遅い)メソッドを使用しますか?また、可能な長さ(1〜8)をカバーする2つのIFでも、アンマネージコードを使用するBlockCopyを使用するよりも高速になります。 –

+0

このコードは、バイトからshortへのビッグエンディアン変換を行っています。 BitConverter.ToInt16はリトルエンディアン変換を使用します。既存のコードの結果と一致させるには、 '(recordData [offset + 1] << 8)| recordData [offset] '、最初のバイトではなく、2番目のバイトをシフトします。 –

関連する問題