ホームページ  >  記事  >  Java  >  Java ネイティブ シリアル化と Kryo シリアル化のパフォーマンス比較分析の例

Java ネイティブ シリアル化と Kryo シリアル化のパフォーマンス比較分析の例

黄舟
黄舟オリジナル
2017-10-10 10:25:112080ブラウズ

この記事では主に、Java と Kryo のシリアル化および逆シリアル化関連の例を含む、Java ネイティブのシリアル化と Kryo シリアル化のパフォーマンス例の比較分析を紹介します。編集者はそれが非常に優れていると考えたので、参考にしていただければと思い、ここで共有します。 。

はじめに

近年、さまざまな新しい効率的なシリアル化メソッドが際限なく登場し、シリアル化パフォーマンスの上限を常に更新しています。 最も典型的なものには次のものがあります。

特に Java 言語用: Kryo、 FST など

クロス言語: Protostuff、ProtoBuf、Thrift、Avro、MsgPack など

これらのシリアル化メソッドのほとんどのパフォーマンスは、hessian2 よりも大幅に優れています (未熟な dubbo シリアル化も含めて)。これを考慮して、dubbo が hessian2 を徐々に置き換えるために、2 つの効率的な Java シリアル化実装、Kryo と FST を導入しました。その中でも、Kryo は非常に成熟したシリアル化実装であり、Twitter、Groupon、Yahoo、および多くの有名なオープンソース プロジェクト (Hive や Storm など) で広く使用されています。 FST は新しいシリアル化実装ですが、現時点では十分な成熟したユースケースがありませんが、それでも非常に有望です。エンティティ クラス Simple.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ネイティブシリアル化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シリアル化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、テスト結果の比較


Javaネイティブシリアル化時間:8281ms
javaネイティブの脱介入時間:5899ms


および


kryoのシリアル化時間:630ms


kryo脱介入時間:15 ms



kryoはそれ以上のものであることがわかりますJava のネイティブのシリアル化パフォーマンスよりも 10 倍優れています

概要

以上がJava ネイティブ シリアル化と Kryo シリアル化のパフォーマンス比較分析の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。