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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#1 投稿記事 by 7 »

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

100回は未確認ですが

#2 投稿記事 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
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

10000回継承するとどうなるか。 -検証-

#3 投稿記事 by konisi »

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

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

提案 To 山本さん
コンパイルに多少多めに時間がかかるようになると思いますが、クラスを多重継承させた場合でも最適の実行コードが吐かれるように改良して欲しいです。
難しい注文ですが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#4 投稿記事 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
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

> Inherits CTestA, CTestB
こういう多重継承が導入される可能性は低いと思います。
Java/C#などのように単独継承とインターフェイス実装にするようですから。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#6 投稿記事 by 7 »

イグトランスさん、ありがとうございます。

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

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