I was going through Java 8 HashMap improvements which shows search performance improvement by around 20 % using Binary tree.
At that point there was a thought how is the insert performance impacted. So I started with inserting few millions of records. Below is the code snippet and different set of results.
import java.util.HashMap;
import java.util.Map;
public class MapWriter {
public static final int MAX_KEY = 1_000_000;
private Map<Double, Double> map = new HashMap<>(MAX_KEY);
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
MapWriter writer = new MapWriter();
for (int i = 0; i < MAX_KEY; i++) {
double random = Math.random();
writer.map.put(random, random);
}
long timeTaken = System.currentTimeMillis() - startTime;
System.out.println("Total Time Taken = " + timeTaken);
System.out.println("Map Size = " + writer.map.size());
}
}
Here are different results:
10 Million Insertions
Java 7
- Total Time Taken = 23145
Java 8
- Total Time Taken = 64964
2 Million Insertions
- Java 7
- Total Time Taken = 6628
- Java 8
- Total Time Taken = 8312
- Java 7
1 Million Insertions
- Java 7
- Total Time Taken = 3577
- Java 8
- Total Time Taken = 1212
- Java 7
The result shows that up to 1 million insertions Java 8 performs better. But the result shows opposite behavior as you move upwards.
How do I explain this behavior??????
Update: Thank you guys for your precious feedback. I need to learn more on benchmarking. I pre-initialized Math.random part and the results were same for both java 7 and java 8. Here is the modified code. Please let me know if the code still looks smelly from benchmarking perspective.
public class MapWriter {
public static int MAX_KEY = 1_000_000;
private Map<Double, Double> map = new HashMap<>(MAX_KEY);
public static void main(String[] args) {
MAX_KEY = Integer.parseInt(args[0]);
Double[] keys = new Double[MAX_KEY];
for(int i = 0; i < MAX_KEY; i++) {
keys[i] = Math.random();
}
MapWriter writer = new MapWriter();
for (int i = 0; i < 100000; i++) {
writer.map.put(keys[i], keys[i]);
}
writer.map = new HashMap<>(MAX_KEY);
long startTime = System.nanoTime();
for (int i = 0; i < MAX_KEY; i++) {
double random = Math.random();
writer.map.put(random, random);
}
long timeTaken = System.nanoTime() - startTime;
System.out.println("Total Time Taken = " + timeTaken / 1000000);
System.out.println("Map Size = " + writer.map.size());
}
}