我正在使用jBinary编写一个mat文件解析器,它构建在jDataView之上。我有一个包含大量测试的工作解析器,但对于大小为10 MB的中等大小的数据集,它的运行速度非常慢。我使用look
进行了分析,发现tagData花费了大量时间。在链接的tagData代码中,ints / uints / single / double / /从文件中逐个读取并推送到数组。显然,这不是超级有效的。我想用基础字节的类型化数组视图替换此代码,以删除所有读取和推送。
我已经开始迁移代码以使用类型化数组,如下所示。除了' miINT8'之外,新代码保留了所有类型的旧功能。新功能尝试查看缓冲区b
,从偏移s
开始,长度为l
,与docs一致。我已经确认传递给s
构造函数的Int8Array
非零,甚至可以将其硬编码到5
。在所有情况下,console.log(elems.byteOffset)
的输出都是0.在我的测试中,我可以看到Int8Array
确实从缓冲区的开头开始而不是在我想要的偏移s
处。
我做错了什么?如何让类型数组从位置s
而不是位置0开始?我已经在node.js版本10.25以及12.0上测试了这个,在每种情况下都有相同的结果。任何指导都会受到赞赏,因为我对此感到非常困惑!
tagData: jBinary.Template({
baseType: ['array', 'type'],
read: function (ctx) {
var view = this.binary.view
var b = view.buffer
var s = view.tell()
var l = ctx.tag.numBytes
var e = s + l
var elems
switch (ctx.tag.type) {
case 'miINT8':
elems = new Int8Array(b,s,l); view.skip(l); console.log(elems.byteOffset); break;
default:
elems = []
while (view.tell() < e && view.tell() < view.byteLength) {
elems.push(this.binary.read(ctx.tag.type))
}
}
return elems
}
}),