- - PR -
型変換に掛かる実行速度の影響
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-07-27 15:24
インタフェースや抽象クラスへの型変換には実行上どれくらいの時間が掛かるものなのでしょうか?
例えば・・・ interface foo... } class hoge implements foo... } とあり、あるメソッドが戻り値をインタフェース型にした場合 public foo get...() { return this._hoge; // hogeクラスのインスタンス } や、 // 呼び出す側 ... { this.set...(this._hoge); } // 呼び出される側 public void set...(foo bar) { } としたような場合です。 よく戻り値や仮引数は必要でない限りインタフェース型で受け取るようにしているのですが、 実行時にどれほど速度に影響があるのか心配になってきました。 Java掲示板での質問ですが、VB.NET等言語によって速度差がある場合なども教えていただければ幸いです。 よろしくお願いします。 |
|
投稿日時: 2007-07-27 15:39
>実行時にどれほど速度に影響があるのか心配になってきました。
実行環境やVMの実装によって異なります。 心配するような影響はまずないと考えて差し支えないです。 |
|
投稿日時: 2007-07-27 16:05
インギさん
返信ありがとうございます。 >心配するような影響はまずないと考えて差し支えないです。 御解答ありがとうございます。とりあえず心配せずにやっていこうかと思います。 |
|
投稿日時: 2007-07-27 16:07
では、測定してみてはいかがでしょうか。
10,000万回くらい試すのを数回やって平均 取れば分かるかもしれませんね。 もしかしたら、ある程度はバイトコード生成時 に上手いことやっているかもしれないですね。 |
|
投稿日時: 2007-07-27 16:23
代入互換性のチェックはjava.lang.Class#isInstance(Object)でなされているでしょうから、
継承階層が浅い場合と深い場合でこのパフォーマンスにどの程度の違いが出るかを計測して見ると面白いのではないでしょうか。 |
|
投稿日時: 2007-07-27 16:55
JVMも内部的にはvtableを持っていると思うので、
C++のdynamic_castと同程度のコストでは? 継承段数+実装インタフェース数の要素数を持った ポインタ配列の線形探索のコストになると思います。 |
|
投稿日時: 2007-07-27 17:16
実際にどの程度の「実行時」チェックが行われるのか良く知らないのですが、
ダウンキャストじゃなくてアップ方向なら、本当の動的なチェックではなくて、 バイトコードの検証時ですんでいるとかではないんでしょうか? まあJavaのバイトコードとかVMとかの内部は全く知らないので感覚的にですが。 |
|
投稿日時: 2007-07-27 23:56
型変換に失敗するとClassCastExceptionを吐くから、何らかのチェックは行っています。
クラスの型変換とインターフェースの型変換がありますが、インターフェースは1階層のみ、 クラスは対象のクラスとの世代の数だけチェックが必要になります。 すなわち数回の文字列比較が必要でしょう。(VMが賢ければ、整数比較でいけるかも。) オブジェクト生成 や メソッド呼び出し よりは軽いですが、四則演算や代入よりは重いでしょう。 いずれにしても、計測することが第一です。 |