【问题标题】:java kryo 3.0.3 low object's serialization speedjava kryo 3.0.3 低对象的序列化速度
【发布时间】:2016-04-13 16:09:59
【问题描述】:

我正在尝试通过使用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 接口序列化相同的对象会更快。 例如,当我将 1000000 作为第二个参数传递给构造函数 kryo188 毫秒 内序列化对象时,当 Serializable136 毫秒 内序列化完全相同的对象时。 p>

那么我做错了什么(这是我歌曲中的配音,哈哈)?

编辑

大小为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 毫秒。

【问题讨论】:

  • 您是否尝试过重用Kryo 实例而不是每次都创建一个新实例?您是否尝试过告诉 Kryo 写入整个数组而不是每个对象?
  • @DarthAndroid 我正在序列化 CustomClass 的一个实例,我尝试通过 kryo 编写 int[] 数组,但是,性能再次低下
  • @DarthAndroid 此实例包含大小为 1000000 的字符串和整数数组

标签: java serialization kryo


【解决方案1】:

如果没有完整的基准代码可用,起初很难评论基准。如果需要进一步分析,请分享。尽管如此,我已经建议将对象创建 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多