文档章节

LiteSetup多线程优化方案

梦想游戏人
 梦想游戏人
发布于 2016/06/12 13:24
字数 743
阅读 184
收藏 0

LiteSetup 轻量级安装程序框架  项目中:

主要是2方面可以多线程优化处理:UI和核心代码,核心代码的压缩多线程处理

1.最开始UI和核心代码在一个线程,导致可能假死现象,

解决方案:给核心代码单独开一个线程。

结果:解决假死问题。伪代码如下

...
void Compress()
{
std::thread t(...
{
...
});
t.detach();
}
...

 

2.由于核心代码跑在一个线程,导致只能利用一个CPU逻辑核心,压缩速度不快

测试数据:打包450MB 左右的ra2,可见 压缩占用时间20s ,io读写  分别为7s  和 0.2s

HDD数据

SSD数据

可见性能瓶颈在压缩处理

优化方案

1.压缩部分开启多线程支持,在读取文件片段后即刻开启一个线程 来压缩 完成后添加到缓存队列,管理线程。

2.势必内存会疯长,所以限制当前文件缓存大小,例如: 如果缓存大小 大于100MB就立刻写入。

3.如果压缩线程数为0,意味着压缩完毕,就立刻把缓存的剩下部分,写入文件。处理后续事件。

整个过程之后压缩是多线程,文件写入是某个压缩线程完成后 执行的,文件读取是在核心线程完成。最后利用轮询是否平衡的

思想判定是否压缩完毕。

测试数据:(整个压缩过程( 文件读取,数据压缩,文件写入))

优化前:   

整个打包过程 25s

优化后:

整个打包过程9s 

结果:加入多线程优化后,效率提升特别大,虽然线程开销导致等效时间(单独一个线程压缩时间,和多个线程每个线程压缩时间之和)多了,36.912-23.461=13秒,但是总效率提升3倍。

部分核心代码:

进一步优化:虽然初步方案得到了很好的效果,但是线程效率比 不高,可以进一步优化。

1. 通过线程池来管理创建的线程,提高单个线程效率

2.dump文件(写入文件)的时候 添加多线程机制,原方案是在某个压缩线程中写入,可能会导致其他压缩完成但未写入缓存的线程挂起

3.调整不同的文件块大小 ,可适当加大FileReader的文件块大小 减少线程切换代价,用内存换取时间。

4.dump文件限制可适当加大,加快整体速度。

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 36
博文 433
码字总数 123540
作品 0
成都
私信 提问
zlib解压压缩数据

LiteSetup中的压缩解压代码 zlib只是对内存段压缩解压,对于文件,我们可以分段 读取到内存然后操作 注意compressBound 有BUG 如果存在压缩后的大小大于原大小,此函数返回的是压缩后最大大小...

梦想游戏人
2016/06/11
56
0
LiteSetup创建快捷方式

运行 生成的临时vbs脚本 来生成 桌面快捷方式 vbs脚本 cpp代码

梦想游戏人
2016/06/10
24
0
Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho
05/30
0
0
【腾讯Bugly干货分享】微信iOS SQLite源码优化实践

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b58022433221be01499480 作者:张三华 前言 随着微信iOS客户端业务的增长,在数据库上遇到的...

腾讯Bugly
2016/08/19
21
0
【腾讯Bugly干货分享】微信iOS SQLite源码优化实践分享实录

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b6a449433221be01499486 Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员...

腾讯Bugly
2016/09/06
43
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
30分钟前
1
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
3
0
3分钟总结Mybatis别名

1.系统内置别名: 把类型全小写(resultType/paramType) 2.给某个类起别名 2.1 alias=”自定义” <typeAliases> <typeAlias type="com.bjsxt.pojo.People" alias="peo"/> </typeAli......

KingFightingAn
昨天
2
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
昨天
8
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部