FireFox 46.0.1:我正在使用第三方(easyrtc)软件在对等体之间发送15KB的Float32Array块。 Easyrtc坚持认为数据是JSON能力的。不幸的是,JSON.stringify产生的字符串是原始数据的两倍多:16384字节的数据变为长度为35755的字符串。下面是我的测试代码,后跟控制台输出。如果可以做任何事情来减少stringify'd大小怎么办?有没有办法只发送值(没有键)?我可以使用'replacer'参数只发送值,如果是,我不需要在接收端的相应JSON.parse上使用替换器吗?
var g_testBufferNBytes = 4096 * 4;
var g_testBuffer = new ArrayBuffer(g_testBufferNBytes);
var g_testBufferView = new Float32Array(g_testBuffer);
console.log("array byte length " + g_testBuffer.byteLength);
console.log("view byte length " + g_testBufferView.byteLength);
var j = JSON.stringify(g_testBufferView);
console.log("j length " + j.length);
var newBuf = JSON.parse(j);
console.log("newBuf length " + Object.keys(newBuf).length);
CONSOLE: 数组字节长度16384 查看字节长度16384 j长度35755 newBuf length 4096
答案 0 :(得分:3)
ES6 :假设您的数据位于let f32 = g_testBufferView
(数组Float32Array
)中-可以通过以下4种方式将其保存为JSON数组:
// code
let f32json = JSON.stringify(f32);
let f32jsonArr = JSON.stringify(Array.from(f32));
let f32base64 = btoa(String.fromCharCode(...(new Uint8Array(f32.buffer))));
let f32base128 = ... // not trivial, look below
// decode
let df32json = new Float32Array(Object.values(JSON.parse(f32json)));
let df32jsonArr = new Float32Array(JSON.parse(f32jsonArr));
let df32base64 = new Float32Array(new Uint8Array([...atob(f32base64)].map(c => c.charCodeAt(0))).buffer);
let df32base128 = ... // not trivial, look below
请注意,Object.values
返回按数字键排序的值(请查看here)。
这里是working example。您还可以使用 base128 进行解码,但在本示例中不使用(不使其复杂化)-更多详细信息here。
如果您的Float32Array
-f32
具有4096个元素,等于0.3
,则:
f32
有16384个字节,f32json
(您问题中的j
)有109483字节(比f32
大6倍)f32jsonArr
有81921字节(比f32
大5倍)f32base64
有21848字节(比f32
大1.3倍)f32base128
具有18725字节(比f32
大<1.15倍),但chrome会发送约2倍的请求(取决于输入数据)如果您的Float32Array
-f32
具有4096个元素(等于1到9的整数),则:
f32
具有16384个字节- CONST ,f32json
(您的问题中的j
)具有35755字节(比f32
大2倍)f32jsonArr
有8193字节(比f32
多2倍 SMALLER (非常好!))f32base64
有21848个字节- CONST (比f32
大1.3倍)f32base128
拥有18725字节- CONST (比f32
大<1.15倍),但chrome会发送约2倍的请求(取决于输入数据)与f32base64
相比输入数组大小大33%时,得到的最小结果与数组值无关(结果大小为常数)。对于f32base128
-它包含有效的JSON(字符串),比输入大<15%,但是在发送过程中,镶边会增加此大小(look here-在“更新”部分)。因此,请使用f32base64
-这可能是不用更复杂的方法就可以获得的最小的JSON。