C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

配列のお話

普段何気なく使っている多次元配列。
過去の自分が作ったソースを見ていると、
ある時期を境に表記が変わっていることに気がついた。

int[][] a; //旧
int[,] a; //新

ある時期というのは、ブランクが1年ほどあるので、
そこが境界なのだが・・・はて、この差はなんだ?
と思いつつも、大して違いはなかろうと、ろくすっぽ調べることなく放置してました。


んで最近、配列の初期化をスタイリッシュに行いたいと思い立ち、以下のソースに出会った。


//int[100]{1,1,1,1,1.....}と同じ
int[] intArray = Enumerable.Repeat(1, 100).ToArray();

//string[10]{"a","a","a"....}と同じ
string[] strArray = Enumerable.Repeat("a", 10).ToArray();


うん、スタイリッシュ。

速さについては知らないが、さほどコールされない初期化処理なら問題にはならんでしょう。
それよりも、初期化処理にfor文を書かずに済む分、非常に見栄えがよろしい。

ところが以下のような多次元配列の初期化が通らない。


int[,] array = Enumerable.Repeat(Enumerable.Repeat(1, 100).ToArray(), 100).ToArray();

なんでもint[,]にint[*][*]を変換できないのだとか。

     |
 \  __  /
 _ (m) _ピコーン
    |ミ|
  /  `´  \
   ('A`)
   ノヽノヽ
     くく   もしや、別物。。。


んでよくよく調べてみると、最初に書いた表記の差は、ジャグ配列と多次元配列という、
全く別ものであることが分かった。


int[][] a; がジャグ配列
int[,] a; が多次元配列


int[][]は四角い配列にする必要がないとかで、直感的に”低速そうだなぁ”と思ったのだが、
よく良く調べてみるとどうも違う。

int[][]は内部的には一次元配列を切り替えて処理するため、
単純な二次元配列よりも高速なのだという。


ほぅ・・・


じゃぁ、二次元配列の強みは?というと、
アンセーフコード化したときにポインタアクセスするのに便利。
さらに、アンセーフコードでポインタアクセスすると高速。
・・・って、おい。

マネージドコードじゃ、いいところ無しかぁ・・


ではジャグ配列の実力とやらを検証してみると
内部的に一次元配列と言いながらも、一次元配列より15%程遅い。

そして、四角い配列はアンマーネジコードで線形アクセスすると早い。
なら最初から一次元配列にしとけばいいんじゃぁ・・・

今までなんとなく二次元配列を使用してましたが、
速度が必要になる画像処理やゲームの世界では、極力一次元配列で実装したほうが良さそう。
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/126-c6648c9e

« のっぴきいかねぇ  | HOME |  苦手意識 »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2017-06 | »
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約