Сцената:
- Използвам XStream, който използва System.identityHashCode много.
- Мигрирах от IBM Java 1.5 към Oracle Java 7
Проблемът:
Виждам проблем с производителността и установих, че System.identityHashCode може да е моят проблем.
Въпроси:
- Има ли някакво добро обяснение защо виждам това влошаване на производителността с по-новата Java (и промяна от IBM на Oracle)?
- Как да заобиколя това тясно място?
По-долу са моите показатели (всички работят на един и същ хардуер):
32 bit Oracle Java 7
System.identityHashCode: 517669471 - 51ns
Object.hashCode: 491220730 - 49ns
64 bit Oracle Java 7:
System.identityHashCode: 353134647 - 35ns
Object.hashCode: 339331774 - 33ns
IBM Java 1.5
System.identityHashCode: 19241979 - 1ns
Object.hashCode: 89621026 - 8ns
Източникът на програмата за сравнение е:
import java.util.*;
public class HashCodeTest
{
static int ITS = 10000000;
static Object O = new Object();
public static void main(String[] args)
{
TreeSet<Integer> large = new TreeSet<Integer>();
Random ran = new Random();
for (int i=0; i<10000; i++) {
large.add(ran.nextInt());
}
testIdentityHashCode(large);
testHashCode(large);
testIdentityHashCode(large);
testHashCode(large);
}
protected static void testIdentityHashCode(TreeSet<Integer> large)
{
long start = System.nanoTime();
for (int i=0; i<ITS; i++) {
Object o = new Container(large);
System.identityHashCode(o);
}
long end = System.nanoTime();
System.out.println("System.identityHashCode: " + (end-start) + " - " + (end-start)/ITS + "ns");
}
protected static void testHashCode(TreeSet<Integer> large)
{
long start = System.nanoTime();
for (int i=0; i<ITS; i++) {
Object o = new Container(large);
o.hashCode();
}
long end = System.nanoTime();
System.out.println("Object.hashCode: " + (end-start) + " - " + (end-start)/ITS + "ns");
}
private static class Container {
private final Object o;
public Container(Object o)
{
this.o = o;
}
}
}