2

キーと値のペアのマッピングに多くの HashMap/HashTable が使用されている Java プログラムがあります。ここで、プログラムで get() メソッドと put() メソッドが呼び出された回数をプロファイリングまたはカウントしたいと考えています。

私が取っていたアプローチは、Java HashMap/HashTable クラスを拡張し、count というメンバーを導入し、メソッドが呼び出されるたびに get() および put() メソッドでカウントをインクリメントすることです。これには、拡張クラスをインスタンス化する代わりに HashMap/HashTables のすべてのインスタンス化を削除する必要があるため、多くのリファクタリングが必要になります。このアプローチは合理的ですか、またはこのカウントを維持するための他のより良い方法はありますか?

4

3 に答える 3

1

このようなタスクの最善の解決策は、YourKitJProfilerなどのプロファイラーを使用することです。プロファイラは、プロファイリングされた JVM によってロードされたすべてのクラス (またはそのサブセット) に対して「インスツルメンテーション」を実行し、コードを 1 行も変更することなく、すべてのメソッド呼び出しをカウントして測定します。

前述の両方のプロファイラーには、試用ライセンスが付属しています。それらを試したら、非常に多くの状況で非常に役立つため、おそらく購入するでしょう。

于 2012-08-29T07:09:47.973 に答える
0

メソッドが実行される回数とコードが実行されるのにかかる時間を示すプロファイリングツールを使用できます。たとえば、Eclipse IDEでこれを行うことができます:http ://www.eclipse.org/projects/project.php?id = tptp.performance

于 2012-08-29T07:12:33.903 に答える
-1

継承を使用できます: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

public class Main{
    public static void main(String[] args){
          HashMap<Integer,Integer> mymap = new myMap<Integer,Integer>();
          mymap.put(3,4);
          mymap.put(5,6);
          System.out.println(mymap.get(3));//this will print 4;
          System.out.println(mymap.getCountGets());//this will print 1 
          System.out.println(mymap.getCountPuts());//this will print 2
    }
}
class myMap<K,V> extends HashMap<K,V> {

public myMap(){
    countPuts = 0;
    countGets = 0;
}
private int countPuts, countGets ;

@Override
public V put(K k, V v){
    countPuts++;
    return super.put(k, v);
}
@Override
public V get(Object k){
    countGets++;
    return super.get(k);
}

public int getCountGets(){
    return countGets;
}

public int getCountPuts(){
    return countPuts;
}

}

于 2014-11-16T19:57:24.953 に答える