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