FlatBuffers使用小结

  最近做一个Android APP,由于离线业务需求,需要在启动APP时候同步大量数据到APP上,遇到了JSON性能瓶颈。从下方的图片中可以看出,当使用 json 传输数据,在解析json的时候会产生大量的对象,使得内存疯狂飙升,不论是配置低端的平板还是配置比较高端的手机都会 GC 。而在使用 flatbuffers 的时候不论是平板还是手机,都没有 GC,并且在时间是数量级的差别。0.5s与0.05s的差距对你而言或许并不大,但是1s和10s的差距就很明显了噻,应该没人能忍受一个app的反应时间需要10s之久吧...

  下面是我测试的参数与测试结果,对比提升可以说是相当的明显了。注(这里的解析时间是指:从发起请求到响应后把数据解析成对象的时间,也就是说除去相差不多的网络传输时间,单纯的对数据的解析时间 faltbuffers 提升会更加明显 )

什么是 FlatBuffers ?

  FlatBuffers是一个高效的跨平台序列化库,适用于C++, C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust 和Swift。它们最早由谷歌创立,用来开发游戏和其他一些需要高性能的程序。

为什么使用 FlatBuffers 会这么快?

  无需解析/拆包即可访问序列化数据-FlatBuffers的与众不同之处在于,它在平坦的二进制缓冲区中表示层次结构数据,使得无需解析/拆包就可以直接访问它,同时还支持数据结构的演进(forward /向后兼容)

如何使用 FlatBuffers ?

1.编译器下载地址:https://github.com/google/flatbuffers/releases

2.编写Schema文件 demo.fbs

namespace com.zxz.demo.flatbuffer;

table User {
id : long;
name : string;
gender : string;
departmentId : long;
createTime : string;
enabled : bool;
status : string;
}

table Account {
id : long;
userId : long;
login : string;
password : string;
loginCount : int;
}

table Data {
userList : [User];
accountList : [Account];
}

root_type Data;

3.生成javaBean文件:flatc.exe --java demo.fbs

4.下载 FlatBuffers 源码:  https://github.com/google/flatbuffers/tree/master/java,或者看看maven仓库有没有依赖包引入项目

5.服务端创建数据

public void service() throws Exception {
    HttpServletResponse response = ActionContext.get().getResponse();
    // 1.创建builder
    FlatBufferBuilder builder = new FlatBufferBuilder(1024);
    List<Integer> list1 = new ArrayList<Integer>();
    for (int i = 0; i < 10; i++) {
        long id = 0L;
        int nameOffset = builder.createString("name");
        int genderOffset = builder.createString("gender");
        long departmentId = 0L;
        int createTimeOffset = builder.createString("2021-01-10");
        boolean enabled = true;
        int statusOffset = builder.createString("status");
        // 2.创建User对象返回 offset值
        int createUser = User.createUser(builder, id, nameOffset, genderOffset, departmentId,
                createTimeOffset, enabled, statusOffset);
        list1.add(createUser);
    }
    // 3.把存储对象offset值的集合转成数组
    int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();
    // 4.构建User的数据
    int createUsersVector = Data.createUsersVector(builder, arr1);
    // 5.构建Data对象(Data中包含[User])
    Data.startData(builder);
    // 6.添加User的集合
    Data.addUsers(builder, createUsersVector);
    int offset = Data.endData(builder);
    Data.finishDataBuffer(builder, offset);
    // 7.把DataBuffer写入到IO中
    ServletOutputStream os = response.getOutputStream();
    os.write(builder.dataBuffer().array(), builder.dataBuffer().position(), builder.offset());
    os.close();
}

6.客户端接收数据

public void onResponse(Call call, Response response) throws IOException {   byte[] bytes = response.body().bytes();
    ByteBuffer bb = ByteBuffer.wrap(bytes);
    Data data = Data.getRootAsData(bb);
}

==================================END==================================

==============================测试结果截图===============================

图一、平板上使用 json 传输数据

图二、手机上使用 json 传输数据

图三、平板上使用 flatbuffers 传输数据

图四、手机上使用 flatbuffers 传输数据

(0)

相关推荐

  • .Net之配置文件自定义

    dotNET跨平台 今天 以下文章来源于鹏祥 ,作者AZRNG 鹏祥分享.Net相关技术文章,一起学习一起成长 前文讲获取配置文件内容的时候,是获取默认的appsettings.json配置文件的配置 ...

  • 670味中药材作用小结,赠给喜爱中医的你

    至道汇推荐搜索腰痛俗话说用药如用兵.你手里的兵越多,打起仗来越有底气.开方也是一样,你掌握的中药越多,对它越是了解,临床开方用药越有底气.12大类670味中药功效总结,送给热爱中医的你 全文共1900 ...

  • 糖尿病患者肝肾功能不全,8 类降糖药剂量如何调整?一图小结

    糖尿病患者常常会伴有肝肾功能不全的情况,因此在治疗上,我们需要根据患者的肝肾功能调整用药,使患者获益风险比达到最大.那么,各类降糖药的剂量该如何调整呢? 表1. 肾功能分期 图源:作者整理 01 双胍 ...

  • 4月阶段小结。

    回望四月,朦胧胧的,看不清.(碎语随笔,3月阶段小结) 1 .<道德经>从69写道78章,就是9章.原本打算四月底完成的读书笔记写作,还未完成.到现在还剩两章未写.这个进度就是慢读书状态. ...

  • 邓铁涛教授常用方剂小结

    发表者:赵东奇 一.治胃.十二指肠溃疡方 [组成]  党参18克,白术12克,云苓15克,柴胡9克佛手片5克,乌贼骨(或瓦楞子(煅))15克,甘草5克. [功效]  健脾益气,舒肝和胃. [主治]  ...

  • 五一档小结|上线影片多、票房赢少输多,电影资本几家欢乐几家愁

    文|杨三喜 刚刚过去的五一假期,中国电影市场迎来了难得的"小阳春".过去数年,受诸多不利因素的影响,中国的电影市场也面临着诸多的挑战,但在刚刚过去的这个五一假期却相当热闹--据统计 ...

  • 五月的花海,周小结

    时间过得好快,对于大四的我来说,更是如此. 从五一到现在,刚刚过去7天,在这期间,看了3本书,写了一篇一万字的研究调查报告.也胡乱写了一些只有自己看得懂的文字(当然,暂时还没考虑发出来). 这段时间和 ...

  • 2021年1~4月投资小结,始终做一个理性的投资人

    原定的一季度投资小结,因为三月底以及整个四月份事情太多,不幸又拖了下来,索性和去年同期一样,再来一次1~4月份投资小结. 统计了一下,截止4月底,今年的股市投资收益大概在19%左右(节后不少持仓个股大 ...

  • 下周天象小结!下周将会是非常美好的一周!!!! -by 古典占星老师吴奕清

    大家好,我是吴奕清. 今天是2021年5月9日星期日. 我们具体来说一说, 下周的重要天象小结. 周一重要天象-- 月木六合 月亮进入金牛座. 如果你最近郁闷了很长时间, 或者说压力比较大. 那你可以 ...

  • 【每周薪传210317】禁牌后的月度总结+两场“不存在的”MO挑战赛小结

    原文作者 Joe Dyer 发布于 MTGGoldfish 薪传META月度更新 自上一波禁牌以来,已经过去了一个多月的时间,我们收集了这段时间所有的 MO 挑战赛及一些线上大赛的数据,现在可以通过下 ...