FAST 協議解析 (三) 完整一個模板以及解析效率問題

廢話

上一章介紹了兩種解析代碼(流程基本一樣),這次我會將示例的數據一起放出來,並探討一下解析的效率問題。

還有一個需要避坑的點,那邊給的數據文檔,和模板文檔,對於字段的解析會出現對不上然後報錯的問題,例如:一個FAST模板定義爲uInt64的字段,按協議文檔的解釋,就是一個無符號的64位整數,也就是範圍在0到2的64次方的一個正整數,按我的理解就是一個Java裏面的Long類型了,但是實際上我調用getLong()方法去取值的時候,大概率會報錯,也就是協議的類型跟Java的定義的類型是有出入的(也可能是我的理解有錯)。

也就是這個類型的原因,我就比較偷懶了,全部用的getString()方法,即全部按照字符串的方式來取值。按理來說,按正確的值去取應該效率會更高一些。

開搞

(1)模板(template.xml)

<?xml version="1.0" encoding="utf-8"?>
<templates xmlns="http://www.FIXprotocal.org/ns/FAST/td/1.1" templateNs="http://www.sse.com.cn/ns/templates/NGTS" ns="http://www.sse.com.cn/ns/STEP1.0.0">
  <!--Snapshot-->
  <template id="4001" name="MDSnapshotFullRefresh_4001">
    <typeRef name="MDSnapshotFullRefresh" />
    <string id="1500" name="MDStreamID">
      <copy />
    </string>
    <string id="48" name="SecurityID">
      <tail />
    </string>
    <byteVector id="55" name="Symbol" presence="optional">
      <default />
    </byteVector>
    <uInt64 id="8503" name="NumTrades" presence="optional">
      <delta />
    </uInt64>
    <uInt64 id="1020" name="TradeVolume" presence="optional">
      <delta />
    </uInt64>
    <decimal id="8504" name="TotalValueTraded" presence="optional">
      <delta />
    </decimal>
    <decimal id="140" name="PrevClosePx" presence="optional">
      <delta />
    </decimal>
    <decimal id="734" name="PrevSetPx" presence="optional">
      <delta />
    </decimal>
    <uInt64 id="8506" name="TotalLongPosition" presence="optional">
      <delta />
    </uInt64>
    <sequence name="MDFullGrp">
      <length id="268" name="NoMDEntries">
        <copy />
      </length>
      <string id="269" name="MDEntryType">
      </string>
      <decimal id="270" name="MDEntryPx" presence="optional">
        <delta />
      </decimal>
      <uInt64 id="271" name="MDEntrySize" presence="optional">
        <delta />
      </uInt64>
      <string id="273" name="MDEntryTime" presence="optional">
      	<tail />
      </string>
      <uInt32 id="290" name="MDEntryPositionNo" presence="optional">
      </uInt32>
    </sequence>
    <string id="8538" name="TradingPhaseCode" presence="optional">
      <copy />
    </string>
  </template>
    
</templates>

(2)模板對應的對象(MDSnapshotFullRefreshEntity、MDFullGrpEntity)

@Setter
@Getter
public class MDSnapshotFullRefreshEntity {
   
    private String MDStreamID;
   
    private String SecurityID;
    
    private String Symbol;
   
    private String NumTrades;
    
    private String TradeVolume;
    
    private String TotalValueTraded;
    
    private String PrevClosePx;
    
    private String PrevSetPx;
    
    private String TotalLongPosition;

    private List<MDFullGrpEntity> MDFullGrp;

}
@Setter
@Getter
public class MDFullGrpEntity {
    
    private String NoMDEntries;

    private String MDEntryType;

    private String MDEntryPx;

    private String MDEntrySize;
    
    private String MDEntryTime;
    
    private String MDEntryPositionNo;
    
    private String TradingPhaseCode;
}

(3)解析工具類(FastDecoderUtils)

這裏放了兩種解析的代碼調用方式,雖說看着都差不多,但是效率上還是有些不一樣的地方。

@Slf4j
public class FastDecoderUtils{

    private static Context contextDecoder2;
    private static FastDecoder fastDecoder;

    private static XMLMessageTemplateLoader templateLoader;
    /**
     * 確保是FAST協議包,這裏不會做協議校驗,解析失敗會拋出異常
     *
     * @param buff
     * @return
     */
    public static List<MDSnapshotFullRefreshEntity> decoder1(byte[] buff) throws Exception {
        if (buff == null) {
            return null;
        }

        List<MDSnapshotFullRefreshEntity> list = new ArrayList<>();
        if (templateLoader == null) {
            //從文件中導入模板,自己注意一下路徑即可
            ClassPathResource classPathResource = new ClassPathResource("template/template.xml");
            InputStream inputStream1 = classPathResource.getStream();
            templateLoader = new XMLMessageTemplateLoader();
            templateLoader.setLoadTemplateIdFromAuxId(true);
            //載入模板
            templateLoader.load(inputStream1);
        }

        //載入數據源
        MessageInputStream mis = new MessageInputStream(new ByteArrayInputStream(buff));
        //註冊模板
        mis.setTemplateRegistry(templateLoader.getTemplateRegistry());

        Message msg111 = null;

        //循環解析,直到解析完
        while ((msg111 = mis.readMessage()) != null) {
            MDSnapshotFullRefreshEntity refreshEntity = new MDSnapshotFullRefreshEntity();

            refreshEntity.setMDStreamID(msg111.getString("MDStreamID"));
            refreshEntity.setSecurityID(msg111.getString("SecurityID"));
            refreshEntity.setSymbol(new String(msg111.getBytes("Symbol"), "GBK"));
            refreshEntity.setNumTrades(msg111.getString("NumTrades"));
            refreshEntity.setTradeVolume(msg111.getString("TradeVolume"));
            refreshEntity.setTotalValueTraded(msg111.getString("TotalValueTraded"));
            refreshEntity.setPrevClosePx(msg111.getString("PrevClosePx"));
            refreshEntity.setPrevSetPx(msg111.getString("PrevSetPx"));
            refreshEntity.setTotalLongPosition(msg111.getString("TotalLongPosition"));

            List<MDFullGrpEntity> mdFullGrp = new ArrayList<>();
            for (int i = 0; i < msg111.getSequence("MDFullGrp").getLength(); i++) {
                GroupValue groupValue = msg111.getSequence("MDFullGrp").get(i);

                MDFullGrpEntity grpEntity = new MDFullGrpEntity();
                grpEntity.setNoMDEntries(groupValue.getString("NoMDEntries"));
                grpEntity.setMDEntryType(groupValue.getString("MDEntryType"));
                grpEntity.setMDEntryPx(groupValue.getString("MDEntryPx"));
                grpEntity.setMDEntrySize(groupValue.getString("MDEntrySize"));
                grpEntity.setMDEntryTime(groupValue.getString("MDEntryTime"));
                grpEntity.setMDEntryPositionNo(groupValue.getString("MDEntryPositionNo"));
                grpEntity.setTradingPhaseCode(groupValue.getString("TradingPhaseCode"));

                mdFullGrp.add(grpEntity);
            }
            refreshEntity.setMDFullGrp(mdFullGrp);
            list.add(refreshEntity);
        }
        return list;
    }

    /**
     * 確保是FAST協議包,這裏不會做協議校驗,解析失敗會拋出異常
     * 
     * @param buff
     * @return
     */
    public static List<MDSnapshotFullRefreshEntity> decoder2(byte[] buff) throws Exception {
        if (buff == null) {
            return null;
        }

        List<MDSnapshotFullRefreshEntity> list = new ArrayList<>();

        if (contextDecoder2 == null) {
            ClassPathResource classPathResource = new ClassPathResource("template/template.xml");
            InputStream inputStream = classPathResource.getStream();
            //一個模板文件可能包含多個模板,我這裏只有1個,省事就直接搞了
            MessageTemplate template = new XMLMessageTemplateLoader().load(inputStream)[0];
            contextDecoder2 = new Context();
            contextDecoder2.registerTemplate(4001, template);

        }
        //解碼器
        fastDecoder = new FastDecoder(contextDecoder2, new ByteArrayInputStream(buff));
        //解碼
        Message msg111 = null;
        while ((msg111 = fastDecoder.readMessage()) != null) {

            MDSnapshotFullRefreshEntity refreshEntity = new MDSnapshotFullRefreshEntity();

            refreshEntity.setMDStreamID(msg111.getString("MDStreamID"));
            refreshEntity.setSecurityID(msg111.getString("SecurityID"));
            refreshEntity.setSymbol(new String(msg111.getBytes("Symbol"), "GBK"));
            refreshEntity.setNumTrades(msg111.getString("NumTrades"));
            refreshEntity.setTradeVolume(msg111.getString("TradeVolume"));
            refreshEntity.setTotalValueTraded(msg111.getString("TotalValueTraded"));
            refreshEntity.setPrevClosePx(msg111.getString("PrevClosePx"));
            refreshEntity.setPrevSetPx(msg111.getString("PrevSetPx"));
            refreshEntity.setTotalLongPosition(msg111.getString("TotalLongPosition"));

            List<MDFullGrpEntity> mdFullGrp = new ArrayList<>();
            for (int i = 0; i < msg111.getSequence("MDFullGrp").getLength(); i++) {
                GroupValue groupValue = msg111.getSequence("MDFullGrp").get(i);

                MDFullGrpEntity grpEntity = new MDFullGrpEntity();
                grpEntity.setNoMDEntries(groupValue.getString("NoMDEntries"));
                grpEntity.setMDEntryType(groupValue.getString("MDEntryType"));
                grpEntity.setMDEntryPx(groupValue.getString("MDEntryPx"));
                grpEntity.setMDEntrySize(groupValue.getString("MDEntrySize"));
                grpEntity.setMDEntryTime(groupValue.getString("MDEntryTime"));
                grpEntity.setMDEntryPositionNo(groupValue.getString("MDEntryPositionNo"));
                grpEntity.setTradingPhaseCode(groupValue.getString("TradingPhaseCode"));

                mdFullGrp.add(grpEntity);
            }
            refreshEntity.setMDFullGrp(mdFullGrp);
            list.add(refreshEntity);
        }
        return list;
    }
}

(4)示例數據以及調用代碼

        byte[] testByte = {-4, 31, -95, 77, 68, 48, 48, -79, 48, 48, 48, 49, 50, -78, -119, -59, -87, -46, -75, -42, -9, -52, -30, -128, 46, -75, -127, 9, 98, 58, -113, 127, 127, 127, 127, -4, 10, 11, 36, -53, -128, -128, -123, -64, -77, 127, 127, 127, 127, -4, 10, 41, 60, -49, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 104, 46, -36, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 34, 17, -80, -128, -128, -128, -72, -125, 117, 88, 124, -46, -128, -128, -104, -77, -119, 49, 56, 48, -74, -81, -52, -84, 32, -128, 1, 80, -126, -127, 37, 13, 102, -85, -127, 29, 6, 41, -60, -128, -128, -64, -77, -126, 120, 38, -42, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -3, 39, 49, 114, -71, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 1, 78, 31, -86, -128, -128, -128, -72, -127, 126, 42, 48, -116, -128, -128, -104, -75, -119, 49, 56, 48, -50, -56, -74, -88, 32, -128, 2, 83, -115, -127, 45, 18, 16, -31, -127, 16, 73, 6, -118, -128, -128, -64, -77, -127, 18, 83, 32, -95, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 126, 63, 44, -56, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 1, 95, 26, -9, -128, -128, -128, -72, -127, 126, 32, 101, -119, -128, -128, -104, -74, -119, -49, -5, -73, -47, 53, 48, 32, 32, -128, 123, 80, -36, -127, 78, 126, 8, -112, -127, 1, 126, 71, -25, -128, -128, -64, -77, -127, 5, 41, 41, -108, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 124, 38, 52, -57, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 4, 66, 91, -18, -128, -128, -128, -72, -127, 123, 61, 36, -110, -128, -128, -104, -72, -119, 51, 56, 48, -69, -7, -79, -66, 32, -128, 2, 27, -72, -127, 114, 97, 18, -74, -127, 106, 116, 110, -24, -128, -128, -64, -77, -127, 106, 127, 31, -65, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 74, 38, -110, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 54, 86, -15, -128, -128, -128, -72, -127, 73, 41, -113, -128, -128, -104, -71, -119, 49, 56, 48, -78, -88, -74, -81, 32, -128, 2, 73, -57, -127, 63, 52, 32, -29, -127, 29, 75, 47, -75, -128, -128, -64, -77, -127, 31, 71, 28, -102, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 126, 29, 97, -54, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 1, 111, 87, -45, -128, -128, -128, -72, -127, 126, 16, 40, -83, -128, -128, -104, 51, -80, -119, 51, 56, 48, -78, -88, -74, -81, 32, -128, 123, 121, -20, -127, 127, 41, 10, 12, -97, -127, 114, 108, 0, -80, -128, -128, -64, -77, -127, 115, 28, 109, -42, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 57, 3, -71, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 73, 125, -65, -128, -128, -128, -72, -127, 127, 54, 2, -63, -128, -128, -104, -79, -119, -55, -49, -42, -92, -72, -33, -48, -62, -128, 127, 35, -52, -127, 2, 9, 51, -95, -127, 85, 8, 29, -117, -128, -128, -64, -77, -127, 85, 0, 53, -115, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 125, 119, -11, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 12, 126, -72, -128, -128, -128, -72, -127, 115, 1, -56, -128, -128, -104, -78, -119, -55, -49, -42, -92, 49, 48, 48, 32, -128, 5, -64, -127, 125, 65, 11, -92, -127, 28, 11, 54, -107, -128, -128, -64, -77, -127, 28, 92, 50, -93, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 59, 5, -112, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 68, 122, -16, -128, -128, -128, -72, -127, 127, 52, 28, -12, -128, -128, -104, -77, -119, -55, -49, -42, -92, 49, 53, 48, 32, -128, 112, -112, -127, 124, 75, 8, -92, -127, 116, 60, 125, -59, -128, -128, -64, -77, -127, 116, 90, 73, -10, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 107, 93, -78, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 23, 49, -27, -128, -128, -128, -72, -127, 101, 121, -9, -128, -128, -104, -76, -119, -55, -49, -42, -92, -46, -8, -48, -48, -128, 1, 45, -64, -127, 15, 100, 17, -75, -126, 101, 91, 8, -48, -128, -128, -64, -77, -127, 105, 16, 59, -32, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 116, 121, -99, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 12, 53, -125, -128, -128, -128, -72, -127, 113, 108, -116, -128, -128, -104, -75, -119, 49, 56, 48, -72, -33, -79, -76, 32, -128, 124, -84, -127, 60, 21, 127, -49, 127, 127, 127, 127, -1, 31, 76, 127, -17, -128, -128, -64, -77, -126, 127, 63, 3, -114, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -1, 28, 106, 33, -75, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -126, 99, 21, 94, -53, -128, -128, -128, -72, 127, 127, 127, 127, -1, 28, 106, 33, -75, -128, -128, -104, -74, -119, 49, 56, 48, -75, -51, -79, -76, 32, -128, 2, 31, -73, -127, 68, 61, 61, -18, -127, 20, 86, 86, -99, -128, -128, -64, -77, -127, 22, 39, 114, -100, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 126, 94, 45, -108, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 1, 44, 72, -6, -128, -128, -128, -72, -127, 126, 73, 80, -87, -128, -128, -104, -73, -119, 51, 56, 48, -72, -33, -79, -76, 32, -128, 125, 23, -120, -127, 125, 83, 85, -12, -127, 103, 65, 113, -71, -128, -128, -64, -77, -127, 103, 67, 4, -83, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -126, 102, 21, 17, -23, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, 127, 127, 127, 127, -1, 25, 114, 43, -81, -128, -128, -128, -72, -126, 102, 13, 84, -47, -128, -128, -104, -72, -119, 51, 56, 48, -75, -51, -79, -76, 32, -128, 89, -42, -127, 114, 125, 63, -6, -127, 3, 116, 90, -126, -128, -128, -64, -77, 127, 127, 127, 127, -1, 29, 96, 30, -121, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 72, 39, -90, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 56, 5, -72, -128, -128, -128, -72, -127, 71, 122, -56, -128, -128, -104, -71, -119, -55, -49, -42, -92, -41, -86, -43, -82, -128, 2, 116, -88, -127, 31, 81, 47, -21, -127, 97, 88, 27, -56, -128, -128, -64, -77, -126, 96, 4, 2, -68, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -1, 1, 76, 46, -32, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -126, 126, 51, 81, -96, -128, -128, -128, -72, 127, 127, 127, 127, -1, 1, 69, 90, -89, -128, -128, -4, 31, -95, 77, 68, 48, 48, -79, 48, 48, 48, 49, 52, -78, -119, 51, 56, 48, -50, -56, -74, -88, 32, -128, 1, 22, -30, -127, 10, 84, 124, -78, 127, 127, 127, 127, -3, 4, 40, 110, -51, -128, -128, -123, -64, -77, 127, 127, 127, 127, -4, 44, 12, 49, -111, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 37, 31, -85, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 91, 7, -33, -128, -128, -128, -72, -127, 127, 34, 57, -117, -128, -128, -104, -75, -119, -45, -59, -54, -58, -41, -54, -44, -76, -128, 71, -69, -126, 118, 17, 51, -51, 127, 127, 127, 127, -1, 20, 72, 13, -72, -128, -128, -64, -77, -127, 110, 18, 57, -93, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 57, 79, -68, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 73, 74, -76, -128, -128, -128, -72, -127, 127, 31, 102, -53, -128, -128, -104, -74, -119, -45, -59, -54, -58, -42, -58, -44, -20, -128, 1, 19, -16, 127, 127, 127, 127, -1, 41, 105, 4, -88, -126, 107, 110, 80, -128, -128, -128, -64, -77, -127, 23, 123, 0, -22, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 28, 52, -29, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 111, 114, -4, -128, -128, -128, -72, -127, 126, 126, 44, -92, -128, -128, -104, -73, -119, -45, -59, -54, -58, -49, -5, -73, -47, -128, 126, 72, -2, -127, 10, 5, 115, -16, 127, 127, 127, 127, -2, 3, 105, 7, 120, -6, -128, -128, -64, -77, -127, 4, 105, 70, -7, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 125, 11, 97, -55, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 3, 28, 65, -93, -128, -128, -128, -72, -127, 124, 98, 123, -35, -128, -128, -104, -72, -119, -49, -5, -73, -47, -63, -20, -49, -56, -128, 2, 127, -14, -127, 42, 48, 103, -20, -127, 13, 78, 124, -88, -128, -128, -64, -77, -127, 3, 105, 66, -47, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 125, 80, 84, -20, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 2, 69, 127, -116, -128, -128, -128, -72, -127, 125, 55, 84, -9, -128, -128, -104, -71, -119, 49, 56, 48, -70, -20, -64, -5, 32, -128, 126, 31, -67, -127, 127, 41, 115, 112, -96, -126, 124, 20, 21, 45, -16, -128, -128, -64, -77, -127, 92, 99, 123, -4, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 85, 74, -18, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 43, 14, -104, -128, -128, -128, -72, -126, 113, 75, 5, -92, -128, -128, -104, 53, -80, -119, 51, 56, 48, -70, -20, -64, -5, 32, -128, 126, 67, -59, -127, 120, 60, 99, -9, -127, 31, 76, 100, -56, -128, -128, -64, -77, 127, 127, 127, 127, -1, 46, 34, 47, -100, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 127, 51, 106, -21, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -126, 85, 72, 0, -44, -128, -128, -128, -72, 127, 127, 127, 127, -1, 42, 55, 127, -84, -128, -128, -104, -79, -119, -55, -49, -71, -6, -70, -20, -64, -5, -128, 0, 106, -57, -127, 2, 50, 21, -81, -127, 86, 84, 127, -46, -128, -128, -64, -77, -126, 81, 47, 73, -48, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -1, 5, 35, 4, -92, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -126, 122, 93, 20, -75, -128, -128, -128, -72, 127, 127, 127, 127, -1, 5, 34, 16, -90, -128, -128, -104, -78, -119, -55, -49, -47, -21, -70, -20, -64, -5, -128, 30, -122, -127, 1, 7, 4, -14, 127, 127, 127, 127, -1, 0, 95, 50, 117, -44, -128, -128, -64, -77, -127, 4, 62, 83, -88, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 105, 72, -2, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 22, 86, -94, -128, -128, -128, -72, -127, 94, 61, -3, -128, -128, -104, -77, -119, -55, -49, -61, -15, -70, -20, -64, -5, -128, 126, 106, -47, -127, 124, 38, 15, -83, -126, 127, 41, 100, 1, -6, -128, -128, -64, -77, -126, 119, 56, 74, -74, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -1, 13, 75, 88, -111, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 34, 71, -98, -128, -128, -128, -72, -127, 91, 41, -119, -128, -128, -104, -75, -119, -54, -48, -42, -75, -80, -39, -57, -65, -128, 5, 77, -30, -126, 11, 76, 34, -1, -127, 0, 74, 78, -59, -128, -128, -64, -77, -127, 1, 26, 43, -88, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 65, 97, -39, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 0, 64, 39, -93, -128, -128, -128, -72, -127, 127, 63, 88, -35, -128, -128, -104, -72, -119, -55, -49, -42, -92, -69, -73, -79, -93, -128, 123, 64, -84, 127, 127, 127, 127, -1, 22, 101, 91, -66, -127, 123, 77, 56, -76, -128, -128, -64, -77, -126, 113, 41, 3, -96, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, 127, 127, 127, 127, -1, 10, 22, 42, -9, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 25, 74, -121, -128, -128, -128, -72, -127, 100, 122, -80, -128, -128, -104, -71, -119, -69, -90, -71, -55, -51, -88, 32, 32, -128, 8, 101, -97, -127, 1, 9, 72, 93, -77, -127, 6, 29, 56, -51, -128, -128, -64, -77, -127, 6, 102, 45, -42, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 65, 90, -23, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 63, 67, -111, -128, -128, -128, -72, -127, 64, 60, -17, -128, -128, -104, 54, -80, -119, -69, -90, -48, -62, -53, -65, -62, -73, -128, 120, 32, -2, -127, 126, 96, 109, 30, -71, -127, 120, 14, 92, -28, -128, -128, -64, -77, -127, 120, 31, 16, -83, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 96, 112, -82, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 33, 101, -11, -128, -128, -128, -72, -127, 92, 77, -45, -128, -128, -104, -79, -119, -69, -90, -42, -48, -71, -6, -44, -20, -128, 96, -127, -127, 32, 87, 108, -69, -126, 119, 73, 111, -77, -128, -128, -64, -77, -127, 2, 16, 42, -5, -128, 49, 48, 51, 49, 48, 51, 48, -80, -128, -64, -76, -127, 101, 32, -61, -128, -128, -128, -128, -75, -128, -128, -128, -128, -73, -127, 26, 95, -67, -128, -128, -128, -72, -127, 99, 66, -7, -128, -128};
        try {
            long time = System.currentTimeMillis();
            for (int i = 0; i < 5000; i++) {
                FastDecoderUtils.decoder2(testByte);
            }
            log.error("方法1用時:{}", System.currentTimeMillis() - time);

            Thread.sleep(2000);

            time = System.currentTimeMillis();
            for (int i = 0; i < 5000; i++) {
                FastDecoderUtils.decoder1(testByte);
            }
            log.error("方法2用時:{}", System.currentTimeMillis() - time);
        } catch (Exception e) {
            e.printStackTrace();
        }

題外話:上面的這個testByte是真實數據了,你們如果用這個數據跟這個模板無法成功解析的話,得找找自己的原因了。

總結

兩種解析方式的代碼對比,對我個人來說,其實第二種我覺得對我個人的理解而言比較友好,先找模板,再新建一個上下文,然後找解碼器解碼,流程很通順。然而事實總是喜歡打臉。

這個數據包裏面包含了大概34條數據,按照循環解析次數做對比,方法1的效率遠比方法2要高得多,而且越往後差距越大,猜測可能是一直要重建解碼器的原因,下面貼上幾次運行結果對比:

100次:方法1(146毫秒),方法2(164毫毛)

500次:方法1(635毫秒),方法2(736毫秒)

1000次:方法1(386毫秒),方法2(2230毫秒)

5000次:方法1(2939毫秒),方法2(34628毫秒)

綜上所述,推薦還是使用方法1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章