ページ 11

クラスの継承回数が...。

Posted: 2006年3月24日(金) 23:41
by 7
クラスをどんどん継承していって、100回継承したとしたらコンストラクタは101回呼び出されるってことですよね。
体感速度はどうだか分かりませんが、継承回数の多いクラスのコンストラクタを実行したらやっぱり時間がかかるんでしょうか?

100回は未確認ですが

Posted: 2006年3月27日(月) 21:28
by MH35
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回継承するとどうなるか。 -検証-

Posted: 2006年3月28日(火) 12:12
by konisi
暇つぶしに1万回継承させるとどのくらい違うのか試してみました。 分かったこと
かかる時間は直接呼び出す方が0と表示され、1万回継承する方は31とい表示された。(つまり、0.031秒程度かかったと。)(32bitマシンで動作した。)
コンパイルにとてつもなく時間がかかる(自宅の環境で30分ほどかかった。)
実行ファイルのサイズが44Kb(100件時)→704Kb(10000件時)となった。滅茶苦茶肥大化してる。

結論
継承をしまくるのはいろんな意味で「重く」なるため、やめた方がいいことが分かった

提案 To 山本さん
コンパイルに多少多めに時間がかかるようになると思いますが、クラスを多重継承させた場合でも最適の実行コードが吐かれるように改良して欲しいです。
難しい注文ですが。

Posted: 2006年3月28日(火) 15:55
by 7
MH35さん、konisiさん、ありがとうございます。

> かかる時間は直接呼び出す方が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

Posted: 2006年3月29日(水) 09:03
by イグトランス
> Inherits CTestA, CTestB
こういう多重継承が導入される可能性は低いと思います。
Java/C#などのように単独継承とインターフェイス実装にするようですから。

Posted: 2006年3月30日(木) 09:31
by 7
イグトランスさん、ありがとうございます。

> > Inherits CTestA, CTestB
> こういう多重継承が導入される可能性は低いと思います。
> Java/C#などのように単独継承とインターフェイス実装にするようですから。
そうなんですか。インターフェイスはActiveBasicが5.0になるとお披露目になるんでしょうかね。
Javaは少し触ったことがあるので知ってたんですけど、C#もインターフェイスとは(?)知りませんでした。

C++環境でオブジェクト指向を勉強しようと思うんですけど、やたらとC++環境を失ってしまうんですよね...。
パソコンをリカバリする時に何故かC++のフォルダだけバックアップし忘れるとか...。
どうでもいい話になってしまいました。