我正在尝试比较标准的 Java 反序列化。并询问这是否是正确的方法。我写了以下课程:
//{"first", 1234.1234, 21341234, 234123412341234124L, "fifth"}
public class ArrayInputStreamStub extends InputStream{
public int[] arr = new int[260];
private int reader = 0;
public ArrayInputStreamStub(){
reader[0] = -84;
//...
}
@Override
public int read() throws IOException {
return arr[reader++];
}
public void reset() {
reader = 0;
}
}
我有相同的 HashMap 存根。
//{("first", 1), ("second", 2), ("third", 3), ("fourth", 4), ("fifth", 5)}
public class HashMapInputStreamStub extends InputStream{
//...
}
现在我的基准如下所示:
public InputStreamStub is;
public ArrayInputStreamStub ais;
@Setup
public void setup(){
is = new InputStreamStub();
ais = new ArrayInputStreamStub();
}
@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void measureDeserializeHashMap(Blackhole bh){
try {
ObjectInputStream ois = new ObjectInputStream(is);
Map<String, Integer> schema = (Map<String, Integer>) ois.readObject();
is.reset();
bh.consume(schema);
} catch (Exception e) {
e.printStackTrace();
}
}
@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void measureDeserializeArray(Blackhole bh){
try {
ObjectInputStream ois = new ObjectInputStream(ais);
Object[] array = (Object[]) ois.readObject();
ais.reset();
bh.consume(array);
} catch (Exception e) {
e.printStackTrace();
}
}
我得到的结果如下:
Benchmark Mode Cnt Score Error Units
MyBenchmark.measureDeserializeArray avgt 5 15.940 ± 0.044 us/op
MyBenchmark.measureDeserializeHashMap avgt 5 12.118 ± 0.057 us/op
接下来的时间只需约 10 微秒。我跑了-prof gc
,结果几乎一样。
问题是这个测量正确吗?这些简单对象的序列化大约需要 10 微秒?