【问题标题】:Better performant alternatives of JSON on mobile devices在移动设备上性能更好的 JSON 替代品
【发布时间】:2016-11-11 21:14:04
【问题描述】:

我正在构建一个 webgl 应用程序。它需要对数据进行反序列化 ~15MB(这是单个对象的大小,我的应用程序中将有大约 10 个),并且该数据的较大部分(90%)是一些浮点数数组和这些数组需要在 JavaScript 中反序列化为 Float32Arrays。

目前我正在使用 JSON。由于我的数据包含大量重复数字,因此它是高度可压缩的,我对网络性能感到满意。除了。我也很满意它在桌面上的表现。然而,将数据加载、反序列化为纯 JS 数组,然后在移动设备上将它们转换为 Float32Arrays 需要花费大量时间。

我考虑过使用 protobuff,但我在 https://protobuffers.codeplex.com/ 上看到了这个

协议缓冲区不是为处理大消息而设计的。如果你是 处理大于一兆字节的消息,可能是时候 考虑另一种策略。

那么我可以做些什么来提高我的应用程序的性能。我应该测试哪些 SERDES 方法?

请引导我完成此过程并帮助我测试我的替代方案,如果您在 cmets 部分提出任何问题,我会提供更多详细信息。

【问题讨论】:

  • 你看过 BSON 吗?
  • @Bergi 我现在就去看看!
  • 这15MB是JSON序列化数据的大小,还是反序列化后内存中数据的大小?根据bsonspec.org/spec.html 看来,BSON 存储的是 64 位浮点数,而不是 32 位,这很遗憾。协议缓冲区有一个双精度和一个浮点数,因此对于您的 32 位浮点数数组,它可能比 BSON 更紧凑,并且很有可能更快。
  • @bazza 这是 JSON 的大小。但是,紧凑性目前不是我关心的问题。即使在本地环境中,移动设备上数据的加载/反序列化也非常缓慢。
  • 坏主意:让服务器发送源代码来制作类型化数组,然后运行eval。这将节省中间步骤。

标签: javascript json serialization deserialization


【解决方案1】:

如果您的对象就像一个大的浮点数组,您可以发送原始字节而不是 JSON 编码的字符串。

XMLHttpRequestresponseType = "arraybuffer"。这样你的“解析步骤”就减少到var floats = new Float32Array(xhr.response)

它甚至会减少这个任务对内存的影响,因为你不需要保留一个 15MB 的大字符串 + 一个包含大约 20MB 双精度的中间数组,我猜 + 生成的 Float32Array 包含另一个 10MB (一半的双打)几乎在同一时间。

您有 1 个仅包含原始字节的 ArrayBuffer + 一个在内存中引用此数据的 Float32Array。


如果这对您不起作用,也许您可​​以解释您发送的数据的性质/结构。

或者你在后端使用的代码,如果序列化是问题的话。

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2021-06-30
    相关资源
    最近更新 更多