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

时间:2016-04-13 16:10:00

标签: java serialization kryo

我试图通过使用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毫秒。

1 个答案:

答案 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