[Java]メソッドの計算量を表示してくれるeclipseプラグインがあれば教えてください。

たとえば、String.equals()よりString.equalsIgnoreCase()の方が計算が複雑なように思えます(※)。
この場合、equals()にマウスをフォーカスしたら「計算量:5」とか、equalsIgnoreCase()にマウスをフォーカスしたら「計算量:20」とかツールチップで表示してくれるようなプラグイン。
マウスフォーカス&ツールチップという表示形式でなくてもいいです。

(※)この私の思い込みはひょっとしたら完全に間違いかもしれませんが、単なる説明のための例示なので、間違っていないものとして読んでください。
(※2)ここで「計算量」という言葉は正確ではないかもしれません。その場合、「重さ」とか何とか、フィーリングで読み替えてください。

なお、この質問が全くの的外れなものである場合、なぜ・どのように的外れで、質問者(私)はどのように勘違いをしているかアドバイスをお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/04/09 19:55:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:qnighy No.1

回答回数19ベストアンサー獲得回数1

ポイント60pt

作ろうとしているプログラムによりますが、基本的にはこの質問は的外れだと思います。

理由は、「計算量」の違いは些細なものだからです。

  • まず、計算量というものは実在しますが、それは数値ではなく、Big-O記法とよばれる式で表現されます。

それに従うと、この例のString.equals()とString.equalsIgnoreCase()は同じ、O(n)という計算量です。

もちろん計算する時間に多少の違いはありますが、それは些細です。なぜなら、どちらにせよ、n(ここでは文字列の長さ)が100倍になれば、時間は100倍だからです。

計算量が違うというのは、例えば、nが100倍なら時間が10000倍つまりO(n^2)だとか、nが5ふえただけなのに時間が30倍つまりO(2^n)だとか、そういうもののことをいいます。

  • 計算量が違うもので、同じ機能のものというのは基本的に存在しないと思います。

たとえば、equalsとequalsIgnoreCaseがあったとして、equalsIgnoreCaseのほうが時間がかかるからといって自分でIgnoreCaseを実装するのは無駄だと思います。

より近い機能のものを選択するのがよいのではないでしょうか。

無理して高速化しようとして、コードに無駄がでて開発しづらくなるようでは、元も子もないと思います。

特に注意が必要だとすれば、主にコレクション(データの集合)の扱いでしょう。

ここは目的によって効率のよいデータ構造がよく考えられているので、正しい選択をしないと計算量が大きく変化するかもしれません。

また、何度も同じ計算をさせるのは確かに非効率で、メモ化とか動的計画法という方法で高速化するケースはあります。ただし、メソッドの実行時間とは関係ないですね。

例として、フィボナッチ数列の計算が有名です。我田引水ですが、http://d.hatena.ne.jp/qnighy/20090120/1232446370 などを参照してください。

また、Javaでかかれたものなら、この記事などがあります。http://programamemo2.blogspot.com/2006/05/java.html

  • ボトルネックが計算処理とは限らないとも思います。

些細な計算を変更するより、ネットワークやファイルなどのI/Oを見直したほうがいい、ということは多いでしょう。

  • また、事前の計算より、計測したほうがより効率よく高速化できるでしょう。

単純なプログラムならいいのですが、事前の計算だけで高速化しようとするのは無駄だと思います。

プロファイラとよばれるツールを使えば、どこに最も処理が集中しているかわかります。それを使って、最も問題のある箇所からつぶしていくのがよいでしょう。

どの方法が高速かというのも、状況によって異なるでしょうから、実際に実行して比較するのがよいでしょう。

プログラムのうち20%が、実行時間の80%を占めているとは、よく言われますしね。

  • また、仮に需要があったとして、各メソッドの「計算量」のデータは存在しないでしょうから、実際このようなプラグインを作るのは無理でしょう。

以上より、この質問は的外れだと思います。

id:arukichigai

丁寧なご回答ありがとうございます。

とても勉強になりました。

2009/04/06 18:18:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません