java kryo 3.0.3 对象的序列化速度较低

标签 java serialization kryo

我正在尝试通过使用 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 毫秒 内序列化对象,而当 Serialized188 毫秒内序列化完全相同的对象时,>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/

相关文章:

java - 为什么我不能跳出这个 while 循环?

java - Criteria API 未生成左外连接

c - 在发送之前是否应该通过 htons 运行一个自定义的 float 表示形式?

java - 在 Kryonet 中增加服务器/客户端的缓冲区大小

java - 使用 Kryo 序列化的 Netty 编码器和解码器

Java 无法在没有明显冗余类型转换的情况下正确推断流类型

java - 了解多模块应用中的 CDI/Weld

python - 在 Django Rest Framework 中使用嵌套序列化程序进行序列化程序字段验证

java - Guava 不可变集合的序列化是否稳定?

serialization - 我如何在 flink 中使用 joda.time(或者我如何使用 typeutils.runtime.kryo)