>  기사  >  Java  >  Java 네이티브 직렬화와 Kryo 직렬화의 성능 비교 분석 예

Java 네이티브 직렬화와 Kryo 직렬화의 성능 비교 분석 예

黄舟
黄舟원래의
2017-10-10 10:25:112088검색

이 글은 주로 Java 및 kryo 직렬화 및 역직렬화 관련 예제를 포함한 Java 네이티브 직렬화 및 Kryo 직렬화 성능 예제의 비교 분석을 소개합니다. 편집자는 이것이 매우 좋다고 생각하며 여러분에게 참고가 되기를 바라면서 여기에서 공유합니다. .

소개

최근에는 다양하고 효율적인 직렬화 방법이 끝없이 등장하여 직렬화 성능의 상한선을 지속적으로 갱신하고 있습니다. 가장 일반적인 방법은 다음과 같습니다.

특히 Java 언어의 경우: Kryo, FST 등

교차 언어: Protostuff, ProtoBuf, Thrift, Avro, MsgPack 등

이러한 직렬화 방법 대부분의 성능은 hessian2보다 훨씬 뛰어납니다(미숙한 dubbo 직렬화도 포함). 이러한 관점에서 우리는 dubbo가 점차적으로 hessian2를 대체하기 위해 두 가지 효율적인 Java 직렬화 구현인 Kryo와 FST를 도입했습니다. 그중 Kryo는 Twitter, Groupon, Yahoo 및 많은 잘 알려진 오픈 소스 프로젝트(예: Hive 및 Storm)에서 널리 사용되는 매우 성숙한 직렬화 구현입니다. FST는 현재 성숙한 사용 사례가 부족한 최신 직렬화 구현이지만 여전히 매우 유망합니다. Java 기본 직렬화와 Kryo 직렬화

1의 성능을 비교해 보겠습니다.
2, 자바 네이티브 직렬화 OriginalSerialized.java


package bhz.entity;
import java.io.Serializable;
import java.util.Map;
public class Simple implements Serializable
{ 
   private static final long serialVersionUID = -4914434736682797743L; 
   private String name; 
   private int age; 
   private Map<String,Integer> map; 
   public Simple(){ 
   } 
   public Simple(String name,int age,Map<String,Integer> map){ 
     this.name = name; 
     this.age = age; 
     this.map = map; 
   } 
   public String getName() { 
    return name; 
   } 
   public void setName(String name) { 
    this.name = name; 
   } 
   public int getAge() { 
    return age; 
   } 
   public void setAge(int age) { 
    this.age = age; 
   } 
   public Map<String, Integer> getMap() { 
    return map; 
   } 
   public void setMap(Map<String, Integer> map) { 
    this.map = map; 
   } 
}

3, kyro 직렬화 KyroSerialized.java


package bhz.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import bhz.entity.Simple;
public class OriginalSerializable { 
  public static void main(String[] args) throws IOException, ClassNotFoundException { 
    long start = System.currentTimeMillis(); 
    setSerializableObject(); 
    System.out.println("java原生序列化时间:" + (System.currentTimeMillis() - start) + " ms" );  
    start = System.currentTimeMillis(); 
    getSerializableObject(); 
    System.out.println("java原生反序列化时间:" + (System.currentTimeMillis() - start) + " ms"); 
  } 
  public static void setSerializableObject() throws IOException{ 
    FileOutputStream fo = new FileOutputStream("D:/file2.bin"); 
    ObjectOutputStream so = new ObjectOutputStream(fo); 
    for (int i = 0; i < 100000; i++) { 
      Map<String,Integer> map = new HashMap<String, Integer>(2); 
      map.put("zhang0", i); 
      map.put("zhang1", i); 
      so.writeObject(new Simple("zhang"+i,(i+1),map)); 
    } 
    so.flush(); 
    so.close(); 
  } 
  public static void getSerializableObject(){ 
     FileInputStream fi; 
    try { 
      fi = new FileInputStream("D:/file2.bin"); 
      ObjectInputStream si = new ObjectInputStream(fi); 
      Simple simple =null; 
      while((simple=(Simple)si.readObject()) != null){ 
        //System.out.println(simple.getAge() + " " + simple.getName()); 
      } 
      fi.close(); 
      si.close(); 
    } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      //e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
  } 
}

4 , 테스트 결과 비교


java 기본 직렬화 시간: 8281ms

java 네이티브 역직렬화 시간: 5899ms


Kryo 직렬화 시간: 630ms

Kryo 역직렬화 시간:15ms

비교 결과 kryo가 10보다 많은 것을 알 수 있습니다. Java의 기본 직렬화보다 몇 배 더 효율적입니다


요약

위 내용은 Java 네이티브 직렬화와 Kryo 직렬화의 성능 비교 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.