2

我有一个 java 程序,其中有很多 HashMap/HashTable 用于映射键值对。现在我想分析或者更确切地说计算在我的程序中调用了多少次 get() 和 put() 方法。

我采用的方法是扩展 Java HashMap/HashTable 类并引入一个名为 count 的成员,并且在 get() 和 put() 方法中,每次调用该方法时都会增加计数。这将涉及大量重构,因为我必须去删除 HashMap/HashTables 的所有实例化来实例化我的扩展类。这种方法合理还是有其他更好的方法来维持这个计数?

4

3 回答 3

1

此类任务的最佳解决方案是使用 Profiler,例如YourKitJProfiler。探查器对被探查的 JVM 加载的所有(或部分)类执行“检测”,以准确执行您需要的操作:计数和测量所有方法调用,而无需修改一行代码。

上述两个分析器都附带试用许可证。一旦你尝试过它们,你可能会买一个,因为它们在很多情况下都非常有用。

于 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 回答