2012-08-16 15 views
5

Javaメソッドコードを入力として受け取り、そのコードのコスト関数(ループの数、if/elses、I/Oおよび他の一般的なもの)を決定するアプローチが既に存在するかどうかを知りたいです。 正確なコストはミリ秒ではありませんが、このコードが引き起こす一般的なコストを意味します。 私は、そのようなメソッドのコストになる可能性があることをユーザーが書くために書く任意のメソッド(JVMなどのようないくつかの特異性を考慮しない)を可能にしたいと考えています。任意のJavaメソッドの一般的なコスト関数を決定する方法はありますか?

+1

この質問は、静的解析の深い問題を扱っています。一般的に、ソリューションは非常に近似していますので、気になるケースで実際には機能しない可能性があります(読み込み、静的解析は難しい)。あなたが*なぜ*これを望んでいるかについてもう少し背景を述べたら、あなたが使うことができるツールについて、より洗練された答えを得ることができるかもしれません。 –

+0

多くの超クールなアルゴリズムは、漸近的な複雑さを証明するためにかなり洗練された手法を必要とします。コードだけでそれを行うのは実用的ではありません。 –

答えて

5

そのようなツールが存在する場合、私は知らないが、私はその実現可能性とその使いやすさの両方を疑う:

  • 一般的なケースでは、そのようなツールの実現可能性についてはHalting problemを見て、どのあなたが求めているものの重要な部分であり、undecidableであることが証明されています。そのようなツールの使いやすさのため

  • 、Iは、システムの性能の重要な部分は、その入力に、即ちその使用パターン、に依存するため、それ自身で静的コード分析は、無駄であると考えています。

    ランタイムのベンチマークシステムでさえ、単純明快ではない理由があります。いくつかのケースでは同じソフトウェアが驚くほど速く、他のソフトウェアでは驚異的に遅くなる可能性があります。前記

は、several tools for code complexity analysisあるが、それらのメトリックは、性能よりも品質及び保守に詳細に関する構造的な複雑さ、に焦点を当てます。

1

ループの数については、/ elsesの場合、循環的複雑度メトリックを使用できます。それを計算するツールがあります。たとえば、JavaNCSSです。他のものに関しては、あなたが何を正確にあなたが興味を持っているか決定する必要があります。software metricsがたくさんあり、それらのいくつかはあなたに適しているかもしれません。そうでない場合は、あなたのことを発明して実装することができます。異なるメトリックを収集するための別の一般的なツールであるPMDは、独自のルールを書くことができます。

コードのパフォーマンスを自動的に予測したい場合は、運が悪いです。理由は、thkalaによって指摘され、その他には、JVM JITコンパイルと実行時の最適化が含まれます。ここであなたの親友はプロファイリング、(自動化された)パフォーマンステストとアルゴリズム解析です。静的分析では、という文字列を連結したり、ループ内にオブジェクトを割り当てるなどのパフォーマンス上の問題が発生する可能性があります。現代のIDEがこれを行うことができます。それでも、パフォーマンスは主にアルゴリズムとアーキテクチャによって決定されるため、静的解析の方法ではほとんど改善されません。

+0

ありがとうございました!はい、私は構造的な複雑さが私に実際のコストを与えることはありませんが、そこから始めて、それ以外のものを考慮に入れる必要があることを知りたいと思います。私はこれらのリンクを勉強し、私は何ができるかを見ていきます。 – kepha

関連する問題