添付のテストを実行しました。結果は一貫して、インデックスによる配列を介したアクセスがキーによるマップを介したアクセスよりも 10 倍高速であることを示しています。この桁違いの違いは私たちを驚かせました。
Map のキーは java.lang.String です ... Map キーの java.lang.String.hashcode() 実装を計算するコストが唯一の理由ですか? 添付のコードでは、キーを 1 つだけ使用して実行しました
java.lang.String key = 1;
この場合、コンパイラ/ランタイムはキャッシュしませんか? それとも、呼び出しごとに再計算しますか?
洞察をありがとう。
public class PerfTest {
static java.util.HashMap<String, Double> map;
static Double[] array = {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0};
static long nTimes = 1000000;
static{
map = new java.util.HashMap<String, Double>();
map.put("1", new Double(1));
map.put("2", new Double(2));
map.put("3", new Double(3));
map.put("4", new Double(4));
map.put("5", new Double(5));
map.put("6", new Double(6));
map.put("7", new Double(7));
map.put("8", new Double(8));
map.put("9", new Double(9));
map.put("10", new Double(10));
}
public static void main(String[] args){
PerfTest tester = new PerfTest();
long timeInMap = tester.testHashMap();
long timeInArray = tester.testArray();
System.out.println("Corrected time elapsed in map(in seconds): "
+ (timeInMap)/1000000000.0);
System.out.println("Corrected time elapsed in array(in seconds): "
+ (timeInArray)/1000000000.0);
}
private long testHashMap(){
int sz = map.size();
long startTime = System.nanoTime();
String key = "1";
for (int i=0; i <nTimes; i++){
double sum = 0;
for (int j =1; j<=sz; j++){
sum += map.get(key);
}
}
return (System.nanoTime() - startTime);
}
private long testArray(){
long startTime = System.nanoTime();
for (int i=0; i <nTimes; i++){
double sum = 0;
for (int j=0; j< array.length; j++) {
sum += array[j];
}
}
return (System.nanoTime() - startTime);
}
}