クラスをどんどん継承していって、100回継承したとしたらコンストラクタは101回呼び出されるってことですよね。
体感速度はどうだか分かりませんが、継承回数の多いクラスのコンストラクタを実行したらやっぱり時間がかかるんでしょうか?
クラスの継承回数が...。
100回は未確認ですが
9回継承の時点では特に大きな差は出ませんでした。
コード
コード
#N88BASIC
' ↓ ここからプログラムが実行されます
Class Test01
End Class
Class Test02
Inherits Test01
End Class
Class Test03
Inherits Test02
End Class
Class Test04
Inherits Test03
End Class
Class Test05
Inherits Test04
End Class
Class Test06
Inherits Test05
End Class
Class Test07
Inherits Test06
End Class
Class Test08
Inherits Test07
End Class
Class Test09
Inherits Test08
End Class
Class Test10
Inherits Test09
End Class
Dim obj1 As *Test01
Dim obj2 As *Test10
Dim t1 As DWord
Dim t2 As DWord
t1=GetTickCount()
obj1=New Test01
t2=GetTickCount()
delete obj1
print t2-t1
t1=GetTickCount()
obj2=New Test10
t2=GetTickCount()
delete obj2
print t2-t1
10000回継承するとどうなるか。 -検証-
暇つぶしに1万回継承させるとどのくらい違うのか試してみました。
かかる時間は直接呼び出す方が0と表示され、1万回継承する方は31とい表示された。(つまり、0.031秒程度かかったと。)(32bitマシンで動作した。)
コンパイルにとてつもなく時間がかかる(自宅の環境で30分ほどかかった。)
実行ファイルのサイズが44Kb(100件時)→704Kb(10000件時)となった。滅茶苦茶肥大化してる。
結論
継承をしまくるのはいろんな意味で「重く」なるため、やめた方がいいことが分かった
提案 To 山本さん
コンパイルに多少多めに時間がかかるようになると思いますが、クラスを多重継承させた場合でも最適の実行コードが吐かれるように改良して欲しいです。
難しい注文ですが。
[ここをクリックすると内容が表示されます]
分かったことtest.sbpを出力するソース
test.abp
コード: 全て選択
#console
Dim I As Long
Dim A$ As String
Open "test.sbp" For Output As #1
Print #1,"Class Test1"
Print #1,"End Class"
For I=1 To 10000
A$="Class Test"+Str$(I+1)
Print #1,A$
A$=" Inherits Test"+Str$(I)
Print #1,A$
Print #1,"End Class"
Next I
Close #1
End
コード: 全て選択
#N88BASIC
#include "test.sbp"
Dim obj1 As *Test1
Dim obj2 As *Test10001
Dim t1 As DWord
Dim t2 As DWord
t1=GetTickCount()
obj1=New Test1
t2=GetTickCount()
delete obj1
print t2-t1
t1=GetTickCount()
obj2=New Test10001
t2=GetTickCount()
delete obj2
print t2-t1
かかる時間は直接呼び出す方が0と表示され、1万回継承する方は31とい表示された。(つまり、0.031秒程度かかったと。)(32bitマシンで動作した。)
コンパイルにとてつもなく時間がかかる(自宅の環境で30分ほどかかった。)
実行ファイルのサイズが44Kb(100件時)→704Kb(10000件時)となった。滅茶苦茶肥大化してる。
結論
継承をしまくるのはいろんな意味で「重く」なるため、やめた方がいいことが分かった
提案 To 山本さん
コンパイルに多少多めに時間がかかるようになると思いますが、クラスを多重継承させた場合でも最適の実行コードが吐かれるように改良して欲しいです。
難しい注文ですが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
MH35さん、konisiさん、ありがとうございます。
> かかる時間は直接呼び出す方が0と表示され、1万回継承する方は31とい表示された。(つまり、0.031秒程度かかったと。)(32bitマシンで動作した。)
やっぱり遅くなってしまうんですね...。
今のActiveBasicって、
こんな感じでただ上から下に継承していくだけですが、下のようにはならないんでしょうか。
> かかる時間は直接呼び出す方が0と表示され、1万回継承する方は31とい表示された。(つまり、0.031秒程度かかったと。)(32bitマシンで動作した。)
やっぱり遅くなってしまうんですね...。
今のActiveBasicって、
コード: 全て選択
Class CTestA
End Class
'CTestAを継承
Class CTestB
Inherits CTestA
End Class
'CTestAを継承しているCTestBを継承
Class CTestC
Inherits CTestB
End Class
コード: 全て選択
Class CTestA
End Class
Class CTestB
End Class
'CTestAとCTestBを継承
Class CTestC
Inherits CTestA,CTestB
End Class
イグトランスさん、ありがとうございます。
> > Inherits CTestA, CTestB
> こういう多重継承が導入される可能性は低いと思います。
> Java/C#などのように単独継承とインターフェイス実装にするようですから。
そうなんですか。インターフェイスはActiveBasicが5.0になるとお披露目になるんでしょうかね。
Javaは少し触ったことがあるので知ってたんですけど、C#もインターフェイスとは(?)知りませんでした。
C++環境でオブジェクト指向を勉強しようと思うんですけど、やたらとC++環境を失ってしまうんですよね...。
パソコンをリカバリする時に何故かC++のフォルダだけバックアップし忘れるとか...。
どうでもいい話になってしまいました。
> > Inherits CTestA, CTestB
> こういう多重継承が導入される可能性は低いと思います。
> Java/C#などのように単独継承とインターフェイス実装にするようですから。
そうなんですか。インターフェイスはActiveBasicが5.0になるとお披露目になるんでしょうかね。
Javaは少し触ったことがあるので知ってたんですけど、C#もインターフェイスとは(?)知りませんでした。
C++環境でオブジェクト指向を勉強しようと思うんですけど、やたらとC++環境を失ってしまうんですよね...。
パソコンをリカバリする時に何故かC++のフォルダだけバックアップし忘れるとか...。
どうでもいい話になってしまいました。