javascript:Float32Array的最小JSON.stringify?

时间:2016-05-19 17:55:48

标签: javascript stringify

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

1 个答案:

答案 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。