java原生の序列化とKryoの序列化の性能の実例の対比は分析します。


概要
ここ数年、各種の新しい高効率な序列化方式が次々と現れて、連続的に序列化の性能の上限を更新しています。
Java言語に特化しているのは、Kryo、FCTなどです。
言語を横断する:Prottotuff、ProtoBuf、Thrift、Avro、MsgPackなど。
これらのプログレッシブ方式の性能の多くはhessian 2(未成熟dubroプログレッシブを含む)に著しく優れている。これに鑑みて、私たちはdubboのためにKryoとFCTという2つの効率的なJavaプログレッシブを導入して、hessian 2を逐次置換します。このうち、Kryoは非常に成熟した序列化が実現され、Twitter、Groupon、Yahooおよび複数の有名なオープンソースプロジェクト(Hive、Stormなど)で広く使われています。FCTは比較的新しい序列化の実現で、まだ十分な成熟した使用事例が足りないです。しかし、それは非常に有望です。以下、私たちは比較してみます。java原生の序列化Kryoプログレッシブ性能を比較します。
1、実体類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原生の序列化Original Serialzable.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、キャロプロローグ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原生序列化時間:8281 ms
java原生反序列化時間:5899 ms

Kryoプログレッシブ時間:630 ms
Kryoアンチプログレッシブ時間:15 ms
対比してみると、kryoはjava原生の序列化性能の十数倍であることが分かります。
締め括りをつける
以上が本論文ではjava原生の序列化とKryoプログレッシブ性能の実例についての対比分析の全部の内容であり、皆さんの役に立つことを望んでいます。興味がある友達は参考にしてもいいです。  Kryoフレーム使用方法コード例  実例解析Json反プログレッシブObjectMapper(カスタム実装反プログレッシブ方法)など、何か問題があったらいつでもメッセージを残してください。