Android效能優化 中
摘要:
7.Android效能優化典範-第4季
5.資料呈現的順序以及結構會對序列化之後的空間產生不小的影響
改變資料結構對記憶體及gzip的影響
gzip
gzip概念:HTTP協議上的GZIP編碼是一種用來改進WE...
7.Android效能優化典範-第4季
5.資料呈現的順序以及結構會對序列化之後的空間產生不小的影響

改變資料結構對記憶體及gzip的影響
- gzip
- gzip概念:HTTP協議上的GZIP編碼是一種用來改進WEB應用程式效能的技術
- 一般對純文字內容可壓縮到原大小的40%
- 減少檔案大小有兩個明顯的好處,一是可以減少儲存空間,二是通過網路傳輸檔案時,可以減少傳輸的時間
- okHttp對gzip的支援
- okHttp支援gzip自動解壓縮,不需要設定Accept-Encoding為gzip
- 開發者手動設定Accept-Encoding,okHttp不負責解壓縮
- 開發者沒有設定Accept-Encoding時,則自動新增Accept-Encoding: gzip,自動新增的request,response支援自動解壓
- 自動解壓時移除Content-Length,所以上層Java程式碼想要contentLength時為-1
- 自動解壓時移除 Content-Encoding
- 自動解壓時,如果是分塊傳輸編碼,Transfer-Encoding: chunked不受影響
- 我們在向伺服器提交大量資料的時候,希望對post的資料進行gzip壓縮,需要使用自定義攔截器
import okhttp3.Interceptor; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okio.BufferedSink; import okio.GzipSink; import okio.Okio; public class GzipRequestInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) { return chain.proceed(originalRequest); } Request compressedRequest = originalRequest.newBuilder() .header("Content-Encoding", "gzip") .method(originalRequest.method(), gzip(originalRequest.body())) .build(); return chain.proceed(compressedRequest); } private RequestBody gzip(final RequestBody body) { return new RequestBody() { @Override public MediaType contentType() { return body.contentType(); } @Override public long contentLength() { return -1; // 無法提前知道壓縮後的資料大小 } @Override public void writeTo(BufferedSink sink) throws IOException { BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); } }; } } 然後構建OkhttpClient的時候,新增攔截器: OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new GzipRequestInterceptor())//開啟Gzip壓縮 ... .build();
- okHttp支援gzip自動解壓縮,不需要設定Accept-Encoding為gzip
- gzip概念:HTTP協議上的GZIP編碼是一種用來改進WEB應用程式效能的技術
- 改變資料結構,就是將原始集合按照集合中物件的屬性進行拆分,變成多個屬性集合的形式.
- 改變資料結構後JSON字串長度有明顯降低
- 使用GZIP對JSON字串進行壓縮,在原始集合中元素資料重複率逐漸變大的情況下,GZIP壓縮後的原始JSON字串長度/GZIP壓縮後的改變資料結構的JSON字串會明顯大於1.
- 程式碼及測試結果如下,結果僅供參考(ZipUtils是網上蕩的,且沒有使用網上用過的Base64Decoder,Base64Encoder)
public final class ZipUtils { /** * Gzip 壓縮資料 * * @param unGzipStr * @return */ public static String compressForGzip(String unGzipStr) { //if (TextUtils.isEmpty(unGzipStr)) { //return null; //} try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(baos); gzip.write(unGzipStr.getBytes()); gzip.close(); byte[] encode = baos.toByteArray(); baos.flush(); baos.close(); //return Base64Encoder.encode(encode); return new String(encode); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * Gzip解壓資料 * * @param gzipStr * @return */ public static String decompressForGzip(String gzipStr) { //if (TextUtils.isEmpty(gzipStr)) { //return null; //} //byte[] t = Base64Decoder.decodeToBytes(gzipStr); byte[] t = gzipStr.getBytes(); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(t); GZIPInputStream gzip = new GZIPInputStream(in); byte[] buffer = new byte[1024]; int n = 0; while ((n = gzip.read(buffer, 0, buffer.length)) > 0) { out.write(buffer, 0, n); } gzip.close(); in.close(); out.close(); return out.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * Zip 壓縮資料 * * @param unZipStr * @return */ public static String compressForZip(String unZipStr) { //if (TextUtils.isEmpty(unZipStr)) { //return null; //} try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(baos); zip.putNextEntry(new ZipEntry("0")); zip.write(unZipStr.getBytes()); zip.closeEntry(); zip.close(); byte[] encode = baos.toByteArray(); baos.flush(); baos.close(); //return Base64Encoder.encode(encode); return new String(encode); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * Zip解壓資料 * * @param zipStr * @return */ public static String decompressForZip(String zipStr) { //if (TextUtils.isEmpty(zipStr)) { //return null; //} //byte[] t = Base64Decoder.decodeToBytes(zipStr); byte[] t = zipStr.getBytes(); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(t); ZipInputStream zip = new ZipInputStream(in); zip.getNextEntry(); byte[] buffer = new byte[1024]; int n = 0; while ((n = zip.read(buffer, 0, buffer.length)) > 0) { out.write(buffer, 0, n); } zip.close(); in.close(); out.close(); return out.toString("UTF-8"); } catch (IOException e) { e.printStackTrace(); } return null; } } public class GzipZipTest { public static void main(String[] args) { GzipZipTest t = new GzipZipTest(); t.t(); } private void t(){ /*List<Person> l = new ArrayList<Person>(); for(int i=0;i<1;i++){ for(int j=0;j<6000;j++){ Person p = new Person(); p.age = j; p.gender = "gender"+j; p.name = "name"+j; l.add(p); } } Gson gson = new Gson(); List<String> names = new ArrayList<String>(); List<String> genders = new ArrayList<String>(); List<Integer> ages = new ArrayList<Integer>(); for(Person p:l){ names.add(p.name); genders.add(p.gender); ages.add(p.age); } PersonItemList itemList = new PersonItemList(); itemList.items = l; String jsonDataOri = gson.toJson(itemList); System.out.println("原始資料結構 壓縮前json資料長度 ---->" + jsonDataOri.length()); PersonAttrList attrList = new PersonAttrList(); attrList.names = names; attrList.genders = genders; attrList.ages = ages; String jsonDataVariety = gson.toJson(attrList); System.out.println("變種資料結構 壓縮前json資料長度 ---->" + jsonDataVariety.length()); System.out.println("==================================================="); for(int i=0;i<100;i++){ //1:原始資料結構 //Gzip壓縮 long start = System.currentTimeMillis(); String gzipStr = ZipUtils.compressForGzip(jsonDataOri); long end = System.currentTimeMillis(); System.out.println("原始資料結構 Gzip壓縮耗時 cost time---->" + (end - start)); System.out.println("原始資料結構 Gzip壓縮後json資料長度 ---->" + gzipStr.length()); //Zip壓縮 //start = System.currentTimeMillis(); //String zipStr = ZipUtils.compressForZip(jsonDataOri); //end = System.currentTimeMillis(); //System.out.println("原始資料結構 Zip壓縮耗時 cost time---->" + (end - start)); //System.out.println("原始資料結構 Zip壓縮後json資料長度 ---->" + zipStr.length()); //2:變種資料結構 //Gzip壓縮 start = System.currentTimeMillis(); String gzipStrVariety = ZipUtils.compressForGzip(jsonDataVariety); end = System.currentTimeMillis(); System.out.println("變種資料結構 Gzip壓縮耗時 cost time---->" + (end - start)); System.out.println("變種資料結構 Gzip壓縮後json資料長度 ---->" + gzipStrVariety.length()); //Zip壓縮 //start = System.currentTimeMillis(); //String zipStrVariety = ZipUtils.compressForZip(jsonDataVariety); //end = System.currentTimeMillis(); //System.out.println("變種資料結構 Zip壓縮耗時 cost time---->" + (end - start)); //System.out.println("變種資料結構 Zip壓縮後json資料長度 ---->" + zipStrVariety.length()); System.out.println("壓縮後 原始結構長度:變種資料結構="+((float)gzipStr.length())/(float)gzipStrVariety.length()); System.out.println("==================================================="); }*/ float repetitionRatio = 0.00F; List<Person> l = new ArrayList<Person>(); for(repetitionRatio = 0.000F; repetitionRatio < 0.500F; repetitionRatio+=0.005F){ int reportIndex = (int) (6000 * (1-repetitionRatio)); for(int i = 0;i<reportIndex;i++){ Person p = new Person(); p.age = i; p.gender = "gender"+i; p.name = "name"+i; l.add(p); } if(repetitionRatio > 0.00F){ int reportCount = (int) (6000 * repetitionRatio); for(int i = 0;i<reportCount;i++){ Person p = new Person(); p.age = i; p.gender = "gender"+i; p.name = "name"+i; l.add(p); } } Gson gson = new Gson(); List<String> names = new ArrayList<String>(); List<String> genders = new ArrayList<String>(); List<Integer> ages = new ArrayList<Integer>(); for(Person p:l){ names.add(p.name); genders.add(p.gender); ages.add(p.age); } PersonItemList itemList = new PersonItemList(); itemList.items = l; String jsonDataOri = gson.toJson(itemList); System.out.println("==================================================="); System.out.println("原始資料結構 壓縮前json資料長度 ---->" + jsonDataOri.length()); PersonAttrList attrList = new PersonAttrList(); attrList.names = names; attrList.genders = genders; attrList.ages = ages; String jsonDataVariety = gson.toJson(attrList); System.out.println("變種資料結構 壓縮前json資料長度 ---->" + jsonDataVariety.length()); //1:原始資料結構 //Gzip壓縮 long start = System.currentTimeMillis(); String gzipStr = ZipUtils.compressForGzip(jsonDataOri); long end = System.currentTimeMillis(); System.out.println("原始資料結構 Gzip壓縮後json資料長度 ---->" + gzipStr.length()); //2:變種資料結構 //Gzip壓縮 start = System.currentTimeMillis(); String gzipStrVariety = ZipUtils.compressForGzip(jsonDataVariety); end = System.currentTimeMillis(); System.out.println("變種資料結構 Gzip壓縮後json資料長度 ---->" + gzipStrVariety.length()); System.out.println("重複率為 "+repetitionRatio/(1-repetitionRatio)+" 壓縮後:原始結構長度:變種資料結構="+((float)gzipStr.length())/(float)gzipStrVariety.length()); } } public class Person implements Serializable{ public String name; public String gender; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class PersonItemList implements Serializable{ public List<Person> items; public List<Person> getItems() { return items; } public void setItems(List<Person> items) { this.items = items; } } public class PersonAttrList implements Serializable{ public List<String> names; public List<String> genders; public List<Integer> ages; public List<String> getNames() { return names; } public void setNames(List<String> names) { this.names = names; } public List<String> getGenders() { return genders; } public void setGenders(List<String> genders) { this.genders = genders; } public List<Integer> getAges() { return ages; } public void setAges(List<Integer> ages) { this.ages = ages; } } } 首先看當單個物件屬性重複率超過100%的情況下列印結果: List<Person> l = new ArrayList<Person>(); for(int i=0;i<1;i++){ for(int j=0;j<6000;j++){ Person p = new Person(); p.age = j; p.gender = "gender"+j; p.name = "name"+j; l.add(p); } } 原始資料結構 壓縮前json資料長度 ---->273011//因為i和j變動,資料會略有變化 變種資料結構 壓縮前json資料長度 ---->129032//因為i和j變動,資料會略有變化 i=x;j=y; //x=1,j=6000:代表資料沒有任何重複的情形 x=1;j=6000; 原始資料結構 Gzip壓縮後json資料長度 ---->44215 變種資料結構 Gzip壓縮後json資料長度 ---->39561 壓縮後 原始結構長度:變種資料結構=1.1176411 //x=2,j=3000:代表每個物件都存在另1個屬性完全一致的物件.單個物件重複率100% x=2;j=3000; 原始資料結構 Gzip壓縮後json資料長度 ---->44204 變種資料結構 Gzip壓縮後json資料長度 ---->27628 壓縮後 原始結構長度:變種資料結構=1.599971 //餘下的代表每單個物件重複率超過100%的情況 x=3;j=2000; 原始資料結構 Gzip壓縮後json資料長度 ---->43733 變種資料結構 Gzip壓縮後json資料長度 ---->17020 壓縮後 原始結構長度:變種資料結構=2.5695064 x=4;j=1500; 原始資料結構 Gzip壓縮後json資料長度 ---->43398 變種資料結構 Gzip壓縮後json資料長度 ---->13914 壓縮後 原始結構長度:變種資料結構=3.119017 x=6;j=1000; 原始資料結構 Gzip壓縮後json資料長度 ---->42166 變種資料結構 Gzip壓縮後json資料長度 ---->8016 壓縮後 原始結構長度:變種資料結構=5.2602296 x=7;j=857; 原始資料結構 Gzip壓縮後json資料長度 ---->41743 變種資料結構 Gzip壓縮後json資料長度 ---->7024 壓縮後 原始結構長度:變種資料結構=5.94291 x=8;j=750; 原始資料結構 Gzip壓縮後json資料長度 ---->41561 變種資料結構 Gzip壓縮後json資料長度 ---->6378 壓縮後 原始結構長度:變種資料結構=6.516306 x=9;j=667; 原始資料結構 Gzip壓縮後json資料長度 ---->41491 變種資料結構 Gzip壓縮後json資料長度 ---->5870 壓縮後 原始結構長度:變種資料結構=7.0683136 x=10;j=600; 原始資料結構 Gzip壓縮後json資料長度 ---->7552 變種資料結構 Gzip壓縮後json資料長度 ---->5503 壓縮後 原始結構長度:變種資料結構=1.3723423 x=12;j=500; 原始資料結構 Gzip壓縮後json資料長度 ---->6955 變種資料結構 Gzip壓縮後json資料長度 ---->4962 壓縮後 原始結構長度:變種資料結構=1.4016526 x=15;j=400; 原始資料結構 Gzip壓縮後json資料長度 ---->6207 變種資料結構 Gzip壓縮後json資料長度 ---->4179 壓縮後 原始結構長度:變種資料結構=1.4852836 x=20;j=300; 原始資料結構 Gzip壓縮後json資料長度 ---->5117 變種資料結構 Gzip壓縮後json資料長度 ---->3576 壓縮後 原始結構長度:變種資料結構=1.4309285 x=30;j=200; 原始資料結構 Gzip壓縮後json資料長度 ---->4511 變種資料結構 Gzip壓縮後json資料長度 ---->3156 壓縮後 原始結構長度:變種資料結構=1.429341 x=40;j=150; 原始資料結構 Gzip壓縮後json資料長度 ---->4359 變種資料結構 Gzip壓縮後json資料長度 ---->3035 壓縮後 原始結構長度:變種資料結構=1.4362438 x=60;j=100; 原始資料結構 Gzip壓縮後json資料長度 ---->2832 變種資料結構 Gzip壓縮後json資料長度 ---->1382 壓縮後 原始結構長度:變種資料結構=2.049204 x=80;j=75; 原始資料結構 Gzip壓縮後json資料長度 ---->2581 變種資料結構 Gzip壓縮後json資料長度 ---->1217 壓縮後 原始結構長度:變種資料結構=2.1207888 x=150;j=40; 原始資料結構 Gzip壓縮後json資料長度 ---->1835 變種資料結構 Gzip壓縮後json資料長度 ---->890 壓縮後 原始結構長度:變種資料結構=2.0617979 x=200;j=30; 原始資料結構 Gzip壓縮後json資料長度 ---->1744 變種資料結構 Gzip壓縮後json資料長度 ---->797 壓縮後 原始結構長度:變種資料結構=2.1882057 x=300;j=20; 原始資料結構 Gzip壓縮後json資料長度 ---->1539 變種資料結構 Gzip壓縮後json資料長度 ---->739 壓縮後 原始結構長度:變種資料結構=2.082544 x=316;j=19; 原始資料結構 Gzip壓縮後json資料長度 ---->1269 變種資料結構 Gzip壓縮後json資料長度 ---->725 壓縮後 原始結構長度:變種資料結構=1.7503449 x=400;j=15; 原始資料結構 Gzip壓縮後json資料長度 ---->1488 變種資料結構 Gzip壓縮後json資料長度 ---->662 壓縮後 原始結構長度:變種資料結構=2.247734 x=500;j=12; 原始資料結構 Gzip壓縮後json資料長度 ---->1453 變種資料結構 Gzip壓縮後json資料長度 ---->563 壓縮後 原始結構長度:變種資料結構=2.580817 x=600;j=10; 原始資料結構 Gzip壓縮後json資料長度 ---->1044 變種資料結構 Gzip壓縮後json資料長度 ---->573 壓縮後 原始結構長度:變種資料結構=1.8219895 x=667;j=9; 原始資料結構 Gzip壓縮後json資料長度 ---->1291 變種資料結構 Gzip壓縮後json資料長度 ---->527 壓縮後 原始結構長度:變種資料結構=2.4497154 x=750;j=8; 原始資料結構 Gzip壓縮後json資料長度 ---->1155 變種資料結構 Gzip壓縮後json資料長度 ---->520 壓縮後 原始結構長度:變種資料結構=2.2211537 x=1000; j=6; 原始資料結構 Gzip壓縮後json資料長度 ---->1269 變種資料結構 Gzip壓縮後json資料長度 ---->429 壓縮後 原始結構長度:變種資料結構=2.958042 x=1200; j=5; 原始資料結構 Gzip壓縮後json資料長度 ---->1135 變種資料結構 Gzip壓縮後json資料長度 ---->478 壓縮後 原始結構長度:變種資料結構=2.374477 x=3000; j=2; 原始資料結構 Gzip壓縮後json資料長度 ---->990 變種資料結構 Gzip壓縮後json資料長度 ---->382 壓縮後 原始結構長度:變種資料結構=2.591623 x=6000; j=1; 原始資料結構 Gzip壓縮後json資料長度 ---->590 變種資料結構 Gzip壓縮後json資料長度 ---->311 壓縮後 原始結構長度:變種資料結構=1.897106 當每個物件屬性重複率低於100%的情況下列印結果: =================================================== 原始資料結構 壓縮前json資料長度 ---->314681 變種資料結構 壓縮前json資料長度 ---->170702 原始資料結構 Gzip壓縮後json資料長度 ---->44215 變種資料結構 Gzip壓縮後json資料長度 ---->39561 重複率為 0.0 壓縮後:原始結構長度:變種資料結構=1.1176411 =================================================== 原始資料結構 壓縮前json資料長度 ---->629141 變種資料結構 壓縮前json資料長度 ---->341162 原始資料結構 Gzip壓縮後json資料長度 ---->88279 變種資料結構 Gzip壓縮後json資料長度 ---->66875 重複率為 0.0050251256 壓縮後:原始結構長度:變種資料結構=1.3200598 =================================================== 原始資料結構 壓縮前json資料長度 ---->943421 變種資料結構 壓縮前json資料長度 ---->511442 原始資料結構 Gzip壓縮後json資料長度 ---->131892 變種資料結構 Gzip壓縮後json資料長度 ---->90806 重複率為 0.01010101 壓縮後:原始結構長度:變種資料結構=1.4524591 =================================================== 原始資料結構 壓縮前json資料長度 ---->1257521 變種資料結構 壓縮前json資料長度 ---->681542 原始資料結構 Gzip壓縮後json資料長度 ---->175554 變種資料結構 Gzip壓縮後json資料長度 ---->116973 重複率為 0.015228426 壓縮後:原始結構長度:變種資料結構=1.5008079 =================================================== 原始資料結構 壓縮前json資料長度 ---->1571501 變種資料結構 壓縮前json資料長度 ---->851522 原始資料結構 Gzip壓縮後json資料長度 ---->218945 變種資料結構 Gzip壓縮後json資料長度 ---->142129 重複率為 0.020408163 壓縮後:原始結構長度:變種資料結構=1.5404668 =================================================== 原始資料結構 壓縮前json資料長度 ---->1885341 變種資料結構 壓縮前json資料長度 ---->1021386 原始資料結構 Gzip壓縮後json資料長度 ---->262306 變種資料結構 Gzip壓縮後json資料長度 ---->168725 重複率為 0.025641024 壓縮後:原始結構長度:變種資料結構=1.5546362 =================================================== 原始資料結構 壓縮前json資料長度 ---->2199091 變種資料結構 壓縮前json資料長度 ---->1191160 原始資料結構 Gzip壓縮後json資料長度 ---->305678 變種資料結構 Gzip壓縮後json資料長度 ---->191222 重複率為 0.030927831 壓縮後:原始結構長度:變種資料結構=1.5985503 =================================================== 原始資料結構 壓縮前json資料長度 ---->2512751 變種資料結構 壓縮前json資料長度 ---->1360844 原始資料結構 Gzip壓縮後json資料長度 ---->348774 變種資料結構 Gzip壓縮後json資料長度 ---->219050 重複率為 0.036269426 壓縮後:原始結構長度:變種資料結構=1.5922118 =================================================== 原始資料結構 壓縮前json資料長度 ---->2826321 變種資料結構 壓縮前json資料長度 ---->1530438 原始資料結構 Gzip壓縮後json資料長度 ---->391506 變種資料結構 Gzip壓縮後json資料長度 ---->243066 重複率為 0.041666664 壓縮後:原始結構長度:變種資料結構=1.6106983 =================================================== 原始資料結構 壓縮前json資料長度 ---->3139801 變種資料結構 壓縮前json資料長度 ---->1699942 原始資料結構 Gzip壓縮後json資料長度 ---->434274 變種資料結構 Gzip壓縮後json資料長度 ---->268432 重複率為 0.047120415 壓縮後:原始結構長度:變種資料結構=1.6178175 **** =================================================== 原始資料結構 壓縮前json資料長度 ---->29936815 變種資料結構 壓縮前json資料長度 ---->16114684 原始資料結構 Gzip壓縮後json資料長度 ---->4187707 變種資料結構 Gzip壓縮後json資料長度 ---->2014350 重複率為 0.9047608 壓縮後:原始結構長度:變種資料結構=2.078937 =================================================== 原始資料結構 壓縮前json資料長度 ---->30248102 變種資料結構 壓縮前json資料長度 ---->16281995 原始資料結構 Gzip壓縮後json資料長度 ---->4232504 變種資料結構 Gzip壓縮後json資料長度 ---->2034384 重複率為 0.92307574 壓縮後:原始結構長度:變種資料結構=2.0804844 =================================================== 原始資料結構 壓縮前json資料長度 ---->30559389 變種資料結構 壓縮前json資料長度 ---->16449306 原始資料結構 Gzip壓縮後json資料長度 ---->4277046 變種資料結構 Gzip壓縮後json資料長度 ---->2053854 重複率為 0.94174635 壓縮後:原始結構長度:變種資料結構=2.082449 =================================================== 原始資料結構 壓縮前json資料長度 ---->30870676 變種資料結構 壓縮前json資料長度 ---->16616617 原始資料結構 Gzip壓縮後json資料長度 ---->4321134 變種資料結構 Gzip壓縮後json資料長度 ---->2072485 重複率為 0.960783 壓縮後:原始結構長度:變種資料結構=2.0850012 =================================================== 原始資料結構 壓縮前json資料長度 ---->31181963 變種資料結構 壓縮前json資料長度 ---->16783928 原始資料結構 Gzip壓縮後json資料長度 ---->4365924 變種資料結構 Gzip壓縮後json資料長度 ---->2087159 重複率為 0.9801967 壓縮後:原始結構長度:變種資料結構=2.0918024 =================================================== 原始資料結構 壓縮前json資料長度 ---->31493250 變種資料結構 壓縮前json資料長度 ---->16951239 原始資料結構 Gzip壓縮後json資料長度 ---->4409476 變種資料結構 Gzip壓縮後json資料長度 ---->2100664 重複率為 0.9999986 壓縮後:原始結構長度:變種資料結構=2.0990868