各位大佬好,我最近接手了一个 native 程序的维护工作(之前以做 Android app 为主),现在遇到一个优化问题,想看看各位有没有什么好的思路。
简单介绍一下这个程序:1.本身是一个单线程程序,定期从一个设备中读取平台下发过来的指令 2.根据指令去操作两类文件,一类是以 ID 命名的文件,一类是汇总了 ID 信息的 bin 文件,举例:有 1-10 个 ID 文件,每个 ID 文件里保存了该文件信息在 bin 文件中的起始位置和长度,而 bin 文件包含了所有 ID 文件的信息。操作主要是新增和删除,新增是创建一个新 ID 文件,然后把相关信息附加到 bin 文件中,删除比较麻烦,需要将 bin 文件读到内存中,然后根据要删除的 ID 文件中的起始位置,做一个 memmove 操作,然后保存到 bin 文件,同时需要修改剩下全部的 ID 文件的起始位置。3.每次新增或者删除了 ID 文件后,都会通知另一个程序来读取剩下的 ID 文件和 bin 文件(可能造成 bin 文件被锁定)
问题:如果平台指令以较慢的速度过来,程序慢慢处理的话 基本上没什么问题,但是如果平台在短时间发送大量指令下来(比如以 20ms 的间隔发送 100 条指令),程序会处于频繁的文件 IO 操作中,然后某些时候 bin 文件读取会有问题,导致后续 memmove 失败,程序崩溃
目前的修改思路:1.平台的指令收到后先放入一个队列,由另一个线程循环读取处理,每次处理有一定的间隔 2.对 bin 文件的操作放在内存中进行,一段时间后没有新指令再写入文件(比如 10s ),同时通知另一个程序来读取变更后的文件。
各位有更好的优化思路的话,欢迎不吝指教,谢谢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.