[リストへもどる]
一括表示

投稿時間:2003/11/01(Sat) 13:21
投稿者名:vbBeginner
Eメール:
URL :
タイトル:
二次元配列の高速アクセス
こんにちは。

Dim Arr1(120) As Integer
Dim Arr2(10,10) As Integer

上記一次元配列と下記二次元配列では要素数は同じ121ですが、
アクセス速度としては一次元配列の方が早いと聞いた覚えがあります。
それで、さも、二次元配列にアクセスしているように見せかける一次元配列
の使い方があるとか・・。よろしかったら教えていただけませんか?
間違っていたら申し訳ないのですが、確かこちらでこの方法が紹介されていたように
思いましたが・・。

投稿時間:2003/11/01(Sat) 14:18
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 二次元配列の高速アクセス
> 間違っていたら申し訳ないのですが、確かこちらでこの方法が紹介されていたように
> 思いましたが・・。

当サイトでは紹介しておりませんが、掲示板の書込みでしたら 過去のログの閲覧・DL より
検索して調べて見て下さい。

当サイトに掲載している内容でしたら 当サイト内外の検索 から検索して調べてみて
下さい。

投稿時間:2003/11/01(Sat) 16:37
投稿者名:vbBeginner
Eメール:
URL :
タイトル:
Re^2: 二次元配列の高速アクセス
> 当サイトでは紹介しておりませんが、掲示板の書込みでした 過去のログの閲覧・DL より
> 検索して調べて見て下さい。
>
> 当サイトに掲載している内容でしたら 当サイト内外の検索 から検索して調べてみて
> 下さい。
僕の拙い書き込みにお返事ありがとうございましたm(_ _)m

さっそく過去ログをDLいたしました。
「配列」で検索しましたが、一言に配列といってもいろいろあるますよねー。
バイト配列にしておくとか・・。投稿No. 2921の内容は興味深かったです。
僕が思っていたのは投稿No. 3467「ジャグ配列」だったのかな・・。
また、じっくり見てみたいと思います。

投稿時間:2003/11/02(Sun) 01:10
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re: 二次元配列の高速アクセス
> 上記一次元配列と下記二次元配列では要素数は同じ121ですが、
> アクセス速度としては一次元配列の方が早いと聞いた覚えがあります。

2次元配列は1次元配列をそのように見せているだけだからです。
メモリは一次元的にならんでいるものだからです。
2次元配列と1次元配列のアクセススピードにmsレベルの差はありません。
CPUの命令レベルの差(数クロック差)があるだけです。

投稿時間:2003/11/02(Sun) 12:37
投稿者名:vbBeginner
Eメール:
URL :
タイトル:
Re^2: 二次元配列の高速アクセス
> 2次元配列は1次元配列をそのように見せているだけだからです。
> メモリは一次元的にならんでいるものだからです。
> 2次元配列と1次元配列のアクセススピードにmsレベルの差はありません。
> CPUの命令レベルの差(数クロック差)があるだけです。
お返事ありがとうございますm(_ _)m

次元数が増えれば増えるほど遅くなると聞いた覚えがあるのですが、メモリ上の配置が同じであるなら
そういう事もなさそうですね。
アクセススピードが遅くなるんでなくて負荷がかかるって事だったのかな・・??

投稿時間:2003/11/02(Sun) 15:21
投稿者名:Say
Eメール:
URL :
タイトル:
Re^3: 二次元配列の高速アクセス
> 次元数が増えれば増えるほど遅くなると聞いた覚えがあるのですが、
NET上の情報は玉石混交ですから、自分でテストするのがベストでしょう。

参考までに下記コードではほとんど差が出ません。
私の環境では1次元を2次元として使うより、
素直に2次元配列を使ったほうが微妙に速いようですが、
全要素に対し1000回ループして数十ミリ秒程度の差ですから、
プログラムの速度改善が目的なら、他にもっと見直すところがあるでしょう。


Option Explicit
Private Const iMAX As Long = 100
Private Const jMAX As Long = 100
Private Const iMAX1 As Long = iMAX - 1
Private Const jMAX1 As Long = jMAX - 1
Private Const ijMAX1 As Long = iMAX * jMAX - 1

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command1_Click()
    Dim lngTime As Long
    Dim i As Long, j As Long, k As Long, n As Long, m As Long
    Dim a1(ijMAX1) As Long
    Dim a2(ijMAX1) As Long
    Dim b1(iMAX1, jMAX1) As Long
    Dim b2(iMAX1, jMAX1) As Long
    '1次元を2次元風にアクセス
    m = 0
    lngTime = timeGetTime()
    For n = 0 To 1000
        For i = 0 To iMAX1
            For j = 0 To jMAX1
                k = i * jMAX + j
                a2(k) = a1(k)
                m = m + 1
            Next
        Next
    Next
    Text1(1).Text = timeGetTime() - lngTime
    Text1(0).Text = m

    '2次元の場合
    m = 0
    lngTime = timeGetTime()
    For n = 0 To 1000
        For i = 0 To iMAX1
            For j = 0 To jMAX1
                'k = i * jMAX + j
                b2(i, j) = b1(i, j)
                m = m + 1
             Next
        Next
    Next
    Text2(1).Text = timeGetTime() - lngTime
    Text2(0).Text = m
    
End Sub

投稿時間:2003/11/02(Sun) 22:04
投稿者名:vbBeginner
Eメール:
URL :
タイトル:
Re^4: 二次元配列の高速アクセス
> NET上の情報は玉石混交ですから、自分でテストするのがベストでしょう。
>
> 参考までに下記コードではほとんど差が出ません。
> 私の環境では1次元を2次元として使うより、
> 素直に2次元配列を使ったほうが微妙に速いようですが、
> 全要素に対し1000回ループして数十ミリ秒程度の差ですから、
> プログラムの速度改善が目的なら、他にもっと見直すところがあるでしょう。
お返事どうもありがとうございますm(_ _)m
掲載していただいたソース、試してみました。たしかにそうは変わらないうようですね。
ちなみに僕にところでも二次元の方が早かったです。