我试图通过使用curl http://localhost:5000/stream
库来更好地表现对象的序列化。
我有下一堂课
kryo
我通过这种方法对其进行血清化,请注意我正在进行单个实例的序列化
public class CustomClass {
private String name;
private int[] array;
public CustomClass(String name, int size){
this.name = name;
fillArray(size);
}
private CustomClass(){ }
private void fillArray(int size){
array = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++){
array[i] = random.nextInt();
}
}
}
但使用标准Java public void kryoWrite(Object object){
Kryo kryo = new Kryo();
Output output = null;
try {
output = new Output(new FileOutputStream("kryo.txt"));
kryo.writeObject(output, object);
} catch (IOException e){
e.printStackTrace();
} finally {
if (output != null) {
output.close();
}
}
}
接口序列化同一个对象的速度更快。
例如,当我将<100>作为第二个参数传递给 188 ms 中的构造函数Serializable
序列化对象时,kryo
在 136 ms 中完全相同的对象序列化>
所以我做错了(在我的歌中它是一个dubstep,哈哈)?
修改
大小为1000000的数组的序列化,由这些方法适当地创建和序列化
Serializable
需要139毫秒。
答案 0 :(得分:0)
如果不是整个基准代码可用,首先很难评论基准。如果需要进一步分析,请分享。尽管如此,我已经建议将对象创建(new CustomObject
)从基准中拉出来(如果不是这样的话)(通常我会在外面创建CustomObject
的数据并将其传递给类)。
为了能够重现此问题,我adopted Kryo's SerializationBenchmarkTest来测试CustomClass
长度为1000000的int[]
(请注意,此基准测试结合了序列化和反序列化,这也可能是单独测量)。
合并后的结果显示了以下(检查提到的提交以获取更多详细信息)以获得最佳的Java序列化运行:
>>> Java serialization via Externalizable (best time): 870 ms
>>> Java serialization without try-catch via Externalizable (best time): 864 ms
为了获得最佳的kryo序列化运行,它显示:
>>> Kryo serialization without try-catch (best time): 835 ms
>>> Kryo unsafe serialization without try-catch, without ASM, without references (best time): 181 ms
>>> Kryo serialization without try-catch with fast streams (best time): 982 ms
>>> Kryo unmodified serialization (best time): 1,108 ms
>>> Kryo unsafe serialization without try-catch, without ASM (best time): 191 ms
>>> Kryo unsafe serialization without try-catch (best time): 193 ms
>>> Kryo serialization (best time): 989 ms
看起来,基于Unsafe
的序列化似乎可以解决这个问题,所以我说你应该尝试使用Kryo UnsafeOutput
代替Output
。