VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2003/03/28(Fri) 14:28
投稿者ひろぽん
Eメール
URL
タイトルRe^2: クラスは遅い?

> その部分のコードを提示して下さい。
> また、どんなデータを読み込んで、どんなマシン環境で、
> どの程度の時間がかかっているのでしょうか?

コードはちょっと長いので、抜粋した形で載せます。マシンはPentium4 1.5GHzで
8.3MBのファイルを読み込んで下記コードのように変数に格納していった場合で15,6秒程度です。
以前作成したクラスを使っていないSDIでは、5秒くらいでした。
変数は、全部で50個程度で、そのうち1次元配列は10個、2次元配列(コレクションで定義)は13個、
3次元配列は3個でした。

'子Formでクラスを定義
  '普通の変数の定義例
    Private m_NumNode As Integer

    Public Property Get NumNode() As Integer
        NumNode = m_NumNode
    End Property

    Public Property Let NumNode(ByVal NewValue As Integer)
        m_NumNode = NewValue
    End Property

  'コレクションを使った2次元配列定義例
    Private Function MakeKey_2D(ByVal pintIndex1 As Integer, _
                                ByVal pintIndex2 As Integer) As String
        MakeKey_2D = CStr(pintIndex1) & "-" & CStr(pintIndex2)
    End Function

    Public Property Get Lsys(ByVal pintIndex As Integer) As Integer
        If (UBound(m_Lsys) < pintIndex) Or (LBound(m_Lsys) > pintIndex) Then
            Lsys = ""
        Else
            Lsys = m_Lsys(pintIndex)
        End If
    End Property

    Public Property Let Lsys(ByVal pintIndex As Integer, ByVal NewValue As Integer)
        If (UBound(m_Lsys) < pintIndex) Then
            ReDim Preserve m_Lsys(pintIndex)
        End If
        m_Lsys(pintIndex) = NewValue
    End Property

'親Formでのファイル読込みルーチン
Private Sub Read_File()
    Dim StrBuffer As String
    Dim Fso       As New FileSystemObject
    Dim FsoTS     As TextStream

    Set FsoTS = Fso.OpenTextFile(RiplsOutFile, ForAppending)

    With FrmChild '子フレームに定義したクラスを使う

    Do Until FsoTS.AtEndOfStream
        StrBuffer = FsoTS.ReadLine
        For i = 1 To 10
            .Lsys(i) = Val(Mid(StrBuffer, 4 * i - 3, 4))
        Next i
            …
        If (.Lsys(3) > 0) Then
            FsoTS.SkipLine
            StrBuffer = FsoTS.ReadLine
            .NumNode = Val(Mid(StrBuffer, 8, 7))
        End If
             …
        For i = 1 To .NumNode
            StrBuffer = FsoTS.ReadLine
            .StnRate(i, .StepNo) = Val(Mid(StrBuffer, 11, 12))
            .StsXY(i, .StepNo) = Val(Mid(StrBuffer, 59, 12))
        Next i
             …
    Loop
    
    End With
        
> Private 内部_3次元配列(100,100,100) As ほげほげ
        …
> のようにすれば普通に3次元配列を使えますが、こういうことではないのでしょうか?

実は、2次元,3次元配列は、Step数(上記コードではDo Loopの数、ファイル毎に違う)や、
節点数(Step毎に違う)や、要素数(これもStep毎に違う)で定義される配列であるため、
動的配列で定義しています。
大きめに初期配列数を取れば、ご助言のとおりの方法でいけると思うのですが、動的配列により
メモリを無駄遣いしないようにと思ってしてしまいました。
とは言いましても、それぞれMin=10,Max=2000程度なので、X(2000,2000,2000)として、
コレクションを使わずに上記方法でクラスで定義した方が賢明なのかもしれません。

> どういうやり方のことを指しているのかよくわかりません。

ファイルを読み込むためのコマンドボタンのあるFormのGeneralの所に、
Option Explicit
Public NumDie As Integer
        …
Public StsXY() As Double
という風に定義しているという意味でした。

> コレクションは便利ですが、あまり大量データを扱うのには向いていません。
        …
> 大量データを高速に扱う必要がある場合は、配列を使うべきです。

上記のように、メモリの無駄はある程度覚悟して、コレクションから配列に変更してみます。
速度の方が優先ですから。

> オブジェクト指向とは?というあたりからの勉強をお勧めします。

たしかに、クラスは始めて2,3週間なので、人のコードをまねしながらしてるだけでした。
一から勉強してみたいと思います。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -