プログラミングの基本事項なのではないかと思いますが、例えば3次元の配列a(100,100,100)があったとき、
do i=1,100
do j=1,100
do k=1,100
a(i,j,k)=.......
enddo; enddo; enddo
とするか、
do k=1,100
do j=1,100
do i=1,100
a(i,j,k)=.......
enddo; enddo; enddo
とするか、を考える場合、基本的にはどちらかのほうが有利である(処理が早くなる)ということだったと思います。a(i,j,k)=...の右辺の式にも依存するかもしれませんが、基本こうしなさいという作法があったと思います。どうだったでしょうか。多次元配列でも、メモリの格納方法は1次元となっており、あちこちに飛ばない方がいいという原理から来るのだと思いますが。言語依存ではないと思いますが。
また、これだけの工夫でどれくらい早くなるものでしょうか。(ルート2)倍ぐらいかにならないでしょうか。
どうだったでしょうか。よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
C には「多次元配列」というものは本来存在しない (2次元配列は「配列の配列」として処理する) わけですがそこは目をつむることにして.
C で
int a[2][3];
とあると, これは「int [3] の配列」となるのでメモリ上
a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2]
と並びます (「a[0][0]~a[0][2]」の部分が a[0] ). 一方 Fortran で
integer :: a(2, 3)
とすると, メモリ上の並びは
a(1, 1), a(2, 1), a(1, 2), a(2, 2), a(1, 3), a(2, 3)
となります.
ここでは 2次元配列で書きましたが, 任意の次元の配列でも同様に
・C では右の添字から先に変化する
・Fortran では左の添字から先に変化する
ので, 添字の動く順序がまったく反対になります.
単純な処理だとこれで速度が実際に変わる (数字もどこかで見た記憶はあるけど忘れた) のですが右辺が複雑だとそっちのせいであまり変わらないかも.
No.1
- 回答日時:
参照の局所性の話であれば, どの順で添字をまわすと速くなる (可能性がある) かは言語に依存します. 有名なのは
Fortran と C では逆
ってやつだな.
回答有難うございます。参照するときにアチコチに飛ぶな、ということですよね。
CとFortranが逆とのことですが、どのように逆なのでしょうか。片方だけ教えて頂ければと思いますが。
また、速くなる可能性はあるが、遅くなる可能性はない、ということであれば、ダメ元でそうするべきとは言えますね。どうでしょうか。
あるいは速くなる可能性40%、変わらない可能性30%、遅くなる可能性30%だとしたら、まあ、そのほうがいいよねとも言えそうですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- 英語 ”be”<動詞>と<助動詞>混同の誤り ― 形式主義文法論の混迷 12 2022/05/17 11:09
- 中学校 英語での答え方はこれで正解ですか? (このように実際に聞くかとかは別として、あくまでも文法として) 2 2022/11/19 17:52
- TOEFL・TOEIC・英語検定 'd の特定方法 1 2023/05/17 22:13
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- 英語 "only to do"を不定詞の名詞的用法で使う可否について 5 2022/06/06 11:23
- 英語 目的を表すso that~やin order that~のthat節内の助動詞の選択方法について 2 2023/06/12 09:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- 英語 The implant was placed to be flush with the crest 3 2022/04/30 00:48
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
VB6 配列を初期化したい
-
えfor文とか使っちゃう時点で時...
-
ArrayListの初期値に二次元配列...
-
VBAで配列をまるごとコピー
-
配列で飛び飛びの値を指定して...
-
subの配列引数をoptionalで使う...
-
delphiで配列を、コピーするには。
-
ListViewで、非表示列って作れ...
-
個数が1以上の行を個数分行コ...
-
動的配列に値を返す関数
-
特定のセル範囲で4文字以上入力...
-
blitz++の使い方。。。
-
配列内の内容を全て表示する方法
-
配列に同じ値を入れる方法
-
Excel VBA配列をFunctionに渡す
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
subの配列引数をoptionalで使う...
-
ListViewで、非表示列って作れ...
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
VBのFunctionで、配列を引数...
-
VB6 配列を初期化したい
-
2次元動的配列の第一引数のみを...
-
Excel-VBAの配列「Public Const...
-
配列内の内容を全て表示する方法
-
Dim は何の略ですか?
-
配列を任意の数値で埋める方法
-
VLOOKUP関数で、一番下...
-
アルゴリズム、配列のフローチ...
-
verilogで配列の任意の8bitを取...
-
えfor文とか使っちゃう時点で時...
-
VBA Match関数の限界
おすすめ情報