JS 序列化类

作者对阿里云MQTT的JS消息解析代码不满,自行实现了一个Archive类。对比了其与原库在性能上的差异,展示了Archive类的使用和性能测试结果。

最近在搞阿里云MQTT。发现消息解析的JS代码另人发指。主要是物模型序列化,太垃圾了。就自己写了一个更简单的Archive类。阿里的工程师都是傻逼吗?

class Archive {
  constructor(capacity) {
    this.capacity = capacity;
    this.size = 0;
    this.u8array = Array(this.capacity);
  }

  _check_resize(){
      if ( this.size < this.capacity) return ;      
      this.capacity = this.capacity*2;
      var newarray = Array(this.capacity);
      for (var i = 0; i < this.size; ++i) newarray[i] = this.u8array[i];
      this.u8array = newarray;
  }
    
  SaveUint8(data ){
      this._check_resize();
      this.u8array[this.size] = data;
      this.size+=1;
  }

  SaveUint16(data){
      this._check_resize();
      this.u8array[this.size] = (data&0xFF00)>>8;
      this.size+=1;

      this._check_resize();
      this.u8array[this.size] = (data&0x00FF);
      this.size+=1;
  }
  GetRawArray(){
      return this.u8array.slice(0,this.size);
  }
}

console.time("test1");
for (var i=0;i<1000;++i){
    var saver1 = new Archive(32);
    for (var j=0;j<100;++j) saver1.SaveUint16(0x1234);
    var result = saver1.GetRawArray();
}
console.timeEnd("test1");

console.time("test2");
for (var i=0;i<1000;++i){
    var payloadArray = [];
    for (var j=0;j<100;++j)  payloadArray = payloadArray.concat(buffer_int16(0x1234)); 
}
console.timeEnd("test2");

function buffer_int16(value) {
    var uint8Array = new Uint8Array(2);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt16(0, value);
    return [].slice.call(uint8Array);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值