Pet*_*e T 3 javascript stringify
FireFox 46.0.1:我使用 3rd-party (easyrtc) 软件在对等点之间发送 15KB 的 Float32Arrays 块。Easyrtc 坚持认为数据是 JSON 格式的。不幸的是,JSON.stringify 生成的字符串是原始数据的两倍多:16384 字节的数据变成了长度为 35755 的字符串。下面是我的测试代码,后面是控制台输出。如果我能做些什么来减少字符串化的大小呢?有没有办法只发送值(没有键)?我可以使用'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);
Run Code Online (Sandbox Code Playgroud)
CONSOLE: 数组字节长度 16384 查看字节长度 16384 j 长度 35755 newBuf 长度 4096
ES6:假设您的数据在let f32 = g_testBufferView (array 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
Run Code Online (Sandbox Code Playgroud)
请注意,Object.values返回值按数字键排序(查看此处)。
这是工作示例。您也可以使用base128进行解码,但我在此示例中未使用(以免使其复杂化)-此处有更多详细信息。
如果您的Float32Array-f32有 4096 个元素,0.3则等于:
f32 有 16384 个字节,f32json(j来自您的问题)有 109483 个字节(大于 6 倍f32)f32jsonArr 有 81921 个字节(比 大 5 倍以上f32)f32base64 有 21848 个字节(比 大~1.3 倍f32)f32base128有 18725 个字节(比 大 <1.15 倍f32)但 chrome 会发送约 2倍大的请求(取决于输入数据)如果您的Float32Array-f32有 4096 个元素等于 1 到 9 的整数,则:
f32有 16384 个字节 - CONST,f32json(j来自您的问题)有 35755 个字节(比 大 2 倍以上f32)f32jsonArr 有 8193 个字节(比 小2倍(原文如此!)f32)f32base64 有 21848 个字节 - CONST(比 大~1.3 倍f32)f32base128有 18725 字节 - CONST(比 1.15 倍大f32),但 chrome 会发送约 2倍大的请求(取决于输入数据)我们得到的不依赖于数组值的最小结果(结果大小是常数)f32base64 比输入数组大小大约 33%。对于f32base128 - 它包含有效的 JSON(字符串),它比输入大 <15%,但是在发送过程中 chrome 增加了这个大小(看这里- 在“更新”部分)。所以使用f32base64- 这可能是您无需更复杂的方法即可获得的最小的 JSON。
| 归档时间: |
|
| 查看次数: |
1944 次 |
| 最近记录: |