我正在尝试通过使用 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();
}
}
}
我正在通过这种方法对其进行序列化,请注意我正在对单个实例进行序列化
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();
}
}
}
但是使用标准 Java 的 Serializable
接口(interface)序列化同一对象的速度更快。
例如,当我将 1000000 作为第二个参数传递给构造函数 kryo
时,在 188 毫秒 内序列化对象,而当 Serialized
在 188 毫秒内序列化完全相同的对象时,>136 毫秒。
那么我做错了什么(这是我歌曲中的回响贝斯,哈哈)?
编辑
大小为 1000000 的数组的序列化,通过这些方法适本地创建和序列化
public static int[] getArray(int size){
int[] array = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++){
array[i] = random.nextInt();
}
return array;
}
public static void kryoWriteArray(int[] array) throws FileNotFoundException {
Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("array.txt"));
output.writeInts(array);
output.close();
}
需要 139 毫秒。
最佳答案
一开始,如果没有完整的基准测试代码,就很难评论基准测试。如果需要进一步分析,请分享。尽管如此,我已经建议将对象创建(new CustomObject
)从基准测试中剔除(如果情况还不是这样的话)(一般来说,我会创建 CustomObject
的数据)外部并将其传递到类中)。
为了能够重现此问题,我 adopted Kryo's SerializationBenchmarkTest使用长度为 1000000 的 int[]
来测试您的 CustomClass
(请注意,此基准测试组合测量序列化和反序列化,也可以单独测量)。
综合结果显示了最佳 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
>.
关于java kryo 3.0.3 对象的序列化速度较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604009/