4


1

byte []のデータを高速で操作する方法は?

持っている `byte []`の4バイトごとに削除する必要があります。 それを行うのに役立つ組み込み関数はありますか、または各バイトを1つずつ選択して移動する配列をループする必要がありますか?

同様に、 `byte []`から3バイトごとに0を配置する必要がある場合は、手動で行うよりも速くこれを行う方法はありますか?

4 Answer


3


手作業でコーディングするのは非常に高速である可能性が高く、ボトルネックはCPUからメモリへの帯域幅です。

1つのコアで最新のマシンのメモリ帯域幅を簡単に最大化できるため、実行される作業は非常に単純であるため(4番目の要素ごとに1回の読み取りまたは書き込み)、マルチスレッドは役に立ちません。


1


http://msdn.microsoft.com/en-us/library/dd460703.aspx [並列Forループ](.NET 4を使用できると仮定した場合)に適しているようです。


1


既存の配列を変更するのではなく、新しい配列を作成してもかまわない場合は、Linqで簡単に実行できます。

bytes = bytes.Where((b, i) => (i + 1) % 4 != 0).ToArray();

3バイトごとにアイテムを挿入するには、組み込みの拡張メソッドを使用してアイテムを挿入する方法はありません。 ただし、独自の拡張メソッドを作成できます。

public static IEnumerable InsertEvery(this IEnumerable source, T valueToInsert, int frequency)
{
    int n = 0;
    foreach (var item in source)
    {
        if ((n + 1) % frequency == 0)
            yield return valueToInsert;
        yield return item;
        n++;
    }
}

...

bytes = bytes.InsertEvery(0, 3).ToArray();

ところで、同じアレイに関連する2つの質問はありますか? i.e. 4バイトごとに削除し、3バイトごとに0を挿入します。すべて同じ配列に入れますか? その場合、本当にやりたいことは4バイトごとに0に置き換えることであり、最も効率的な方法はforループを使用することです。

for(int i = 3; i < bytes.Length; i += 4)
{
    bytes[i] = 0;
}


0


おそらく最速の方法は、新しい配列を作成する代わりに、インデックスを変換するラッパーを作成することです。