投稿時間: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週間なので、人のコードをまねしながらしてるだけでした。 一から勉強してみたいと思います。
|