C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

byte2次元配列を部分的にbyte1次元配列にコピー

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■96177 / inTopicNo.1)  byte2次元配列を部分的にbyte1次元配列にコピー
  
□投稿者/ taro (15回)-(2020/10/26(Mon) 15:12:36)

分類:[C#] 


byte[] src = {1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 7, 8, 9, 0, 0, };
byte[,] dst = new byte[3, 3];

という変数がある際、dstに
------
1 2 3
4 5 6
7 8 9
------
というように「srcを5byteずつ区切って、各行の先頭3byteをdstにコピーする」
という事をしたい場合、最も高速なやり方はどのような方法でしょうか?

上記はサンプルデータですが、実際は5000*5000程のbyte型2次元配列へのセットを想定しております。


よろしくお願い致します。

引用返信 編集キー/
■96178 / inTopicNo.2)  Re[1]: byte2次元配列を部分的にbyte1次元配列にコピー
□投稿者/ furu (87回)-(2020/10/26(Mon) 16:02:24)
2020/10/26(Mon) 16:03:39 編集(投稿者)

No96177 (taro さん) に返信
> という事をしたい場合、最も高速なやり方はどのような方法でしょうか?
「最も高速なやり方」は
最適化が最も適化ではないのと同様に
誰もわからないんじゃないかな。

「srcを5byteずつ」も100byteずつだったら
かなりやり方も変わると思います。

Span<T>,Array.Copy,Buffer.BlockCopyあたり?

いろいろやってみて、計った方がいいです。
引用返信 編集キー/
■96179 / inTopicNo.3)  Re[1]: byte2次元配列を部分的にbyte1次元配列にコピー
□投稿者/ shu (1237回)-(2020/10/26(Mon) 16:36:44)
No96177 (taro さん) に返信

インデックスがずれると大変ですが、
2次元配列のインデックスを(x,y) x:0...4999 y:0...4999
として
5000 * y + x
でsrcのインデックスとしてアクセスできるのでそのまま利用するというやり方もあります。
引用返信 編集キー/
■96180 / inTopicNo.4)  Re[1]: byte2次元配列を部分的にbyte1次元配列にコピー
□投稿者/ KOZ (144回)-(2020/10/26(Mon) 17:17:03)
No96177 (taro さん) に返信

思いついたコード

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
static extern void MoveMemory(ref byte dest, ref byte src, int size);

static void Main(string[] args)
{
    var src = new byte[] { 1, 2, 3, 0, 0, 4, 5, 6, 0, 0, 7, 8, 9, 0, 0, };
    var dst = new byte[3, 3];
    MoveMemory(ref dst[0, 0], ref src[0], 3);
    MoveMemory(ref dst[1, 0], ref src[5], 3);
    MoveMemory(ref dst[2, 0], ref src[10], 3);
}

あとは、String.cs のこのあたり

https://referencesource.microsoft.com/#mscorlib/system/string.cs#372

Unsafe コードを使って CPU が 64 ビットなら long, そうでないなら int にキャストして比較しているんですが、同じようにキャストして代入すると速いかも。
(終端の処理が面倒そう)

引用返信 編集キー/
■96181 / inTopicNo.5)  Re[2]: byte2次元配列を部分的にbyte1次元配列にコピー
□投稿者/ taro (16回)-(2020/10/26(Mon) 17:26:35)
furuさん
shuさん
KOZさん

お返事ありがとうございました。
それぞれのやり方を参考に検討させて頂きました。
諸々の条件を考慮した結果、
shuさんの「Indexを工夫し、1次元配列の変数を用いる」やり方で進めていこうと思います。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ