标签:arraybuffer typed-arrays arrays javascript
我一直在寻找如何调整ArrayBuffers大小的方法,下面是两种方法:
1(Uint8Array):
function resizeUint8(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
resizedView = new Uint8Array(resizedArrayBuffer),
baseView = new Uint8Array(baseArrayBuffer);
for(var i = 0; i < baseView.length; i++) {
resizedView[i] = baseView[i];
}
return resizedArrayBuffer;
}
2(Float64Array):
// newByteSize is divisible by 8
function resizeFloat64(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
resizedView = new Float64Array(resizedArrayBuffer),
baseView = new Float64Array(baseArrayBuffer);
for(var i = 0; i < baseView.length; i++) {
resizedView[i] = baseView[i];
}
return resizedArrayBuffer;
}
比较:#1利用Uint8Arrays,因此对于baseArrayBuffer中的每个字节,您必须将其分别复制到调整大小的数组缓冲区中.现在,对于#2,我使用了Float64Array,因此我可以迭代减少8倍以上的索引来获得相同的结果.
关注:使用Float64Array似乎是显而易见的“性能更高”的方法.但是,使用Float64Array时我缺少什么吗?通过Float64Array视图设置每个索引时,我是否会失去数值精度?还有其他缺点吗(除了确保字节大小可以被8整除)?
解决方法:
不用复制for循环中的每个元素,而是使用typedArray.set方法,它更快
function resizeUint8(baseArrayBuffer, newByteSize) {
var resizedArrayBuffer = new ArrayBuffer(newByteSize),
len = baseArrayBuffer.byteLength,
resizeLen = (len > newByteSize)? newByteSize : len;
(new Uint8Array(resizedArrayBuffer, 0, resizeLen)).set(new Uint8Array(baseArrayBuffer, 0, resizeLen));
return resizedArrayBuffer;
}
JSFiddle测试:http://jsfiddle.net/92zsn529/
标签:arraybuffer,typed-arrays,arrays,javascript 来源: https://codeday.me/bug/20191122/2059369.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。