Heim  >  Artikel  >  Java  >  Beispiele für Leistungsvergleichsanalysen zwischen der nativen Java-Serialisierung und der Kryo-Serialisierung

Beispiele für Leistungsvergleichsanalysen zwischen der nativen Java-Serialisierung und der Kryo-Serialisierung

黄舟
黄舟Original
2017-10-10 10:25:112098Durchsuche

In diesem Artikel wird hauptsächlich die vergleichende Analyse von Beispielen für die native Java-Serialisierung und Kryo-Serialisierung vorgestellt, einschließlich Beispielen für Java- und Kryo-Serialisierung und -Deserialisierung. Der Herausgeber findet es sehr gut, und ich teile es hier mit Ihnen, in der Hoffnung, es Ihnen zu geben ein Verweis auf.

Einführung

In den letzten Jahren sind in einem endlosen Strom verschiedene neue effiziente Serialisierungsmethoden entstanden, die die Obergrenze der Serialisierungsleistung ständig aktualisieren Dazu gehören:

Speziell für Java-Sprache: Kryo, FST usw.

Sprachübergreifend: Protostuff, ProtoBuf, Thrift, Avro, MsgPack usw.

Die Leistung der meisten dieser Serialisierungsmethoden ist deutlich besser als hessian2 (sogar einschließlich der unausgereiften Dubbo-Serialisierung). Vor diesem Hintergrund haben wir zwei effiziente Java-Serialisierungsimplementierungen, Kryo und FST, eingeführt, damit Dubbo nach und nach Hessian2 ersetzt. Unter diesen ist Kryo eine sehr ausgereifte Serialisierungsimplementierung, die in Twitter, Groupon, Yahoo und vielen bekannten Open-Source-Projekten (wie Hive und Storm) weit verbreitet ist. FST ist eine neuere Serialisierungsimplementierung, der es derzeit an genügend ausgereiften Anwendungsfällen mangelt, die jedoch immer noch sehr vielversprechend ist. Vergleichen wir die Leistung der Java-nativen Serialisierung und der Kryo-Serialisierung

1. 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; 
   } 
}
2. Java native Serialisierung OriginalSerializable.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(); 
    } 
  } 
}
3. Kyro-Serialisierung KyroSerializable.java



package bhz.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.objenesis.strategy.StdInstantiatorStrategy;
import bhz.entity.Simple;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
public class KyroSerializable { 
  public static void main(String[] args) throws IOException { 
    long start = System.currentTimeMillis(); 
    setSerializableObject(); 
    System.out.println("Kryo 序列化时间:" + (System.currentTimeMillis() - start) + " ms" ); 
    start = System.currentTimeMillis(); 
    getSerializableObject(); 
    System.out.println("Kryo 反序列化时间:" + (System.currentTimeMillis() - start) + " ms"); 
  } 
  public static void setSerializableObject() throws FileNotFoundException{ 
    Kryo kryo = new Kryo(); 
    kryo.setReferences(false); 
    kryo.setRegistrationRequired(false); 
    kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); 
    kryo.register(Simple.class); 
    Output output = new Output(new FileOutputStream("D:/file1.bin")); 
    for (int i = 0; i < 100000; i++) { 
      Map<String,Integer> map = new HashMap<String, Integer>(2); 
      map.put("zhang0", i); 
      map.put("zhang1", i); 
      kryo.writeObject(output, new Simple("zhang"+i,(i+1),map)); 
    } 
    output.flush(); 
    output.close(); 
  } 
  public static void getSerializableObject(){ 
    Kryo kryo = new Kryo(); 
    kryo.setReferences(false); 
    kryo.setRegistrationRequired(false); 
    kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); 
    Input input; 
    try { 
      input = new Input(new FileInputStream("D:/file1.bin")); 
      Simple simple =null; 
      while((simple=kryo.readObject(input, Simple.class)) != null){ 
        //System.out.println(simple.getAge() + " " + simple.getName() + " " + simple.getMap().toString()); 
      } 
      input.close(); 
    } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
    } catch(KryoException e){ 
    } 
  } 
}
4. Vergleich der Testergebnisse


Zeit der nativen Java-Serialisierung: 8281 ms


Zeit der nativen Java-Deserialisierung: 5899 ms


und


Kryo-Serialisierungszeit: 630 ms


Kryo-Deserialisierungszeit: 15 ms


Nach dem Vergleich kann festgestellt werden, dass Kryo mehr als zehn beträgt Mal besser als die native Serialisierungsleistung von Java

Zusammenfassung

Das obige ist der detaillierte Inhalt vonBeispiele für Leistungsvergleichsanalysen zwischen der nativen Java-Serialisierung und der Kryo-Serialisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn