BitMatrix
BitMatrix 以
ArrayBuffer
为基础, 以bit
为单元的矩阵类实现;
特性:
- 按需选择矩阵类,节省内存;
- 统一API方便矩阵操作;
- 支持将矩阵对像通过
base64
导入导出, 打通存储问题;
适用场景:
任何需要存储点阵信息的场景;
类说明:
除了
ArrayBuffer
做存储的矩阵, 还提供AnyMatrix
,AnyMatrixUseObject
两个类;
这两个类主要用于做为参照物; 也可以做为可以存储任意值的矩阵来使用; API相同
class | base DataView | value range |
---|---|---|
BitMatrix | 0 / 1 |
|
Int8Matrix | Int8Array | Int8 |
Uint8Matrix | Uint8Array | Uint8 |
Uint8ClampedMatrix | Uint8ClampedArray | Uint8 |
Int16Matrix | Int16Array | Int16 |
Uint16Matrix | Uint16Array | Uint16 |
Int32Matrix | Int32Array | Int32 |
Uint32Matrix | Uint32Array | Uint32 |
Float32Matrix | Float32Array | Float32 |
Float64Matrix | Float64Array | Float64 |
AnyMatrix | Array | any |
AnyMatrixUseObject | Object | any |
安装
npm i bitmatrix
使用
nodejs
const BitMatrix = BitMatrix;//使用其它的矩阵类//const {BitMatrix, Uint8Matrix, AnyMatrix} = require('bitmatrix');let bm = 220; //初始化一个以 0 填充的 2*2 矩阵 console;
ES2015
// 默认导出 BitMatrix 类; //使用其它的矩阵类//import {BitMatrix, Uint8Matrix, AnyMatrix} from 'bitmatrix' console;
浏览器
浏览器使用时可选择 己打包依赖的文件 ./dist/BitMatrix.umd.js
API
API 可能还会有变化, 欢迎提意见.
复制矩阵
推荐使用矩阵对像的 clone()
方法;
导入导出
为获取最大兼容,选用
base64
为媒介进行导入(input()
), 导出(output()
);
导入/导出的数据结构:
前9个字节为描述字节, 后面为数据;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||||||||||||
Uint32LE(width) | Uint32LE(height) | Uint8(typeMark) | ...(data) |
;let bm = 770;bm;bm; let b64 = BitMatrix;console;let bm1 = BitMatrixinputb64;console /*AAAABwAAAAcDCATij0AgAA==0,0,0,1,0,0,00,0,0,1,0,0,00,0,0,1,0,0,01,1,1,1,1,1,10,0,0,1,0,0,00,0,0,1,0,0,00,0,0,1,0,0,0*/
兼容
基于
BufferArray
只能运行于支持ES2015
的环境;
性能测试
node v10.13.0
内存占用 从以下的表格看, 是符合预期的.
生成 2000 个 100*100 矩阵, 并用 1 填充, 内存及耗时占用情况:
┌─────────┬──────────────────────┬────────────┬────────────┬──────────────────────┬───────────────────┐
│ (index) │ className │ heapUsed │ external │ sum │ time │
├─────────┼──────────────────────┼────────────┼────────────┼──────────────────────┼───────────────────┤
│ 0 │ 'BitMatrix' │ '0.77MB' │ '2.38MB' │ '3.16MB | 1.91%' │ '7 | 1.46%' │
│ 1 │ 'Int8Matrix' │ '0.87MB' │ '19.07MB' │ '19.94MB | 12.07%' │ '16 | 3.33%' │
│ 2 │ 'Uint8Matrix' │ '0.82MB' │ '19.07MB' │ '19.90MB | 12.04%' │ '14 | 2.92%' │
│ 3 │ 'Uint8ClampedMatrix' │ '0.82MB' │ '19.07MB' │ '19.89MB | 12.04%' │ '15 | 3.13%' │
│ 4 │ 'Int16Matrix' │ '0.80MB' │ '38.15MB' │ '38.95MB | 23.57%' │ '17 | 3.54%' │
│ 5 │ 'Uint16Matrix' │ '0.68MB' │ '38.15MB' │ '38.83MB | 23.50%' │ '19 | 3.96%' │
│ 6 │ 'Int32Matrix' │ '0.53MB' │ '76.29MB' │ '76.82MB | 46.49%' │ '147 | 30.63%' │
│ 7 │ 'Uint32Matrix' │ '0.53MB' │ '76.29MB' │ '76.82MB | 46.49%' │ '139 | 28.96%' │
│ 8 │ 'Float32Matrix' │ '0.53MB' │ '76.29MB' │ '76.82MB | 46.49%' │ '140 | 29.17%' │
│ 9 │ 'Float64Matrix' │ '0.49MB' │ '152.59MB' │ '153.08MB | 92.64%' │ '286 | 59.58%' │
│ 10 │ 'AnyMatrix' │ '153.61MB' │ '0.00MB' │ '153.61MB | 92.96%' │ '2445 | 509.38%' │
│ 11 │ 'AnyMatrixUseObject' │ '153.75MB' │ '0.00MB' │ '153.75MB | 93.05%' │ '6056 | 1261.67%' │
│ 12 │ 'number[]' │ '153.13MB' │ '0.00MB' │ '153.13MB | 92.67%' │ '2808 | 585.00%' │
│ 13 │ 'number[][]' │ '165.24MB' │ '0.00MB' │ '165.24MB | 100.00%' │ '480 | 100.00%' │
└─────────┴──────────────────────┴────────────┴────────────┴──────────────────────┴───────────────────┘
可执行
npm run test-memory
命令测试, 获取本结果;
node v10.13.0
基准测试 操作同为 1000*1000 矩阵, 基础方法的QPS比较:
┌─────────┬─────────────────┬───────────┬─────────────┬─────────────┬─────────────┐
│ (index) │ name │ fill │ get │ set │ cellForEach │
├─────────┼─────────────────┼───────────┼─────────────┼─────────────┼─────────────┤
│ 0 │ 'BitMatrix' │ '210.31K' │ '8194.21K' │ '6275.51K' │ '700.17' │
│ 1 │ 'Uint8Matrix' │ '25.63K' │ '10969.26K' │ '9658.56K' │ '991.44' │
│ 2 │ 'Uint32Matrix' │ '2.66K' │ '11844.04K' │ '10304.60K' │ '992.45' │
│ 3 │ 'Float64Matrix' │ '1.19K' │ '11845.38K' │ '10639.79K' │ '988.99' │
│ 4 │ 'AnyMatrix' │ '1.23K' │ '11453.06K' │ '10560.18K' │ '987.83' │
│ 5 │ 'number[]' │ '1.15K' │ '15009.22K' │ '14345.48K' │ '960.72' │
│ 6 │ 'number[][]' │ '752.19' │ '12196.47K' │ '11029.79K' │ '1.48K' │
└─────────┴─────────────────┴───────────┴─────────────┴─────────────┴─────────────┘
get
与set
测试都使用了9个点, 所以真实值应该再乘上9;
可执行npm run test-benchmark
命令, 获取本结果;
Other
- 添加各API参数合法性检测
- 处理好 单元测试, 基准测试, 内存测试代码;
- 单元测试
- 基准测试
- 内存占用测试
- 增加基准测试范围;
- Matrix.from(arr:[][]|[][,width])
- 编码
- 测试
- .clone()
- 编码
- 测试
- .copy() .copyTo()
- copy()
- copyTo()
- 导出, 导入;
- typeBuffer Matrix 转 base64
- base64 转 Matrix