この記事では主に、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;
}
}
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(); } } }
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){ } } }
Javaネイティブシリアル化時間:8281ms
javaネイティブの脱介入時間:5899ms
および
kryoのシリアル化時間:630ms
kryo脱介入時間:15 ms
kryoはそれ以上のものであることがわかりますJava のネイティブのシリアル化パフォーマンスよりも 10 倍優れています
概要
以上がJava ネイティブ シリアル化と Kryo シリアル化のパフォーマンス比較分析の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。