Skip to content

性能优化 ​

[🕒 预计 20 分钟] | 难度:进阶

1. 界面卡顿优化 ​

1.1 大批量列表更新 ​

向列表控件批量插入大量条目时,不要在事件或线程循环中逐条刷新界面——每秒数千次 UI 更新会让界面彻底卡死。正确做法:

  • 用 线程_提交进度(&工作处理器, &进度处理器, &完成处理器, 参数) 提交任务。进度通知由运行时合并后再派发,界面更新只发生在进度与完成处理器里。
  • 工作处理器里只算不画:用 线程_报告进度(百分比, 说明) 汇报进度,禁止直接操作 Win32 控件。
  • 列表确实需要大量条目时,先在完成处理器里一次性写入;批量插入前应关闭控件重绘,写完再恢复。

WARNING

多线程模块 1.x 的 线程_批量启动、线程_启动延时设置文本、线程_启动延时添加行、线程_启动延时添加项目、线程_休眠、线程_等待全部、线程_活动数量、线程_硬件并发数 在 2.0 中已列为旧版命令,不再贡献命令实现,调用会被诊断阻断。旧项目请改用 线程_提交进度 + 线程_协作等待 + 线程_等待。

lcpp
// 大规模任务:一次提交,进度合并,界面只在处理器里更新
线程任务 任务 = 线程_提交进度(&导入数据, &导入进度, &导入完成, 文件列表)

1.2 不要阻塞界面线程 ​

  • 在界面事件中调用 线程_等待、线程池_等待空闲 等同步等待命令会直接卡住界面;确需等待时必须给有限超时,并优先把后续逻辑放进完成处理器。
  • 后台任务里的短暂让出用 线程_协作等待(毫秒),它同时是协作取消的响应点;配合 线程_请求取消(任务) 与 线程_是否请求取消(0) 实现可中断的长任务。
  • 网络请求使用 HTTP客户端_GET异步 等异步入口,完成后再通过处理器回调更新界面。
  • 完成的任务用 线程_释放任务 单独回收,或用 线程_清理已完成 批量清理,避免任务对象堆积。

2. 内存与资源 ​

  • JSON 值等由模块创建的对象,用完后调用对应释放命令(如 JSON_释放)。
  • 图片资源尽量压缩尺寸后再加载。
  • 列表数据频繁增长时注意清理过期条目。

3. 构建产物 ​

手段说明
按需 SDK模块的 C++ 依赖按需物化到构建目录,未启用模块不参与编译
发布运行库交付前确认目标机器已安装 Visual C++ Redistributable
精简发布参考 打包发布 的离线精简发布流程

4. 定位性能问题 ​

  • 用 调试输出 在关键路径输出时间点,结合底部 输出面板 观察耗时分布。
  • 界面卡顿时优先检查:是否在事件中同步执行了耗时操作、是否高频逐条刷新列表控件。

用队列做跨线程数据传递(2.1.0) ​

多线程模块 2.1.0 提供线程安全队列族(队列_创建/入队/出队/上次出队是否成功/取长度/是否为空/清空/销毁,共 8 条)。工作线程算完一条就 队列_入队,界面侧用有限超时 队列_出队 再刷新控件,比高频 线程_报告进度 更适合成批结果的场景:

  • 有界队列(容量 1~100000)在生产快于消费时阻塞生产者,天然防止内存膨胀。
  • 队列_出队 返回空文本不代表失败,必须用 队列_上次出队是否成功() 判断。
  • 队列元素支持文本、整数、字节集(队列_入队整数/出队整数/入队字节集/出队字节集),出队按规则自动转换,有效性用 队列_上次出队是否成功() 判断。

下一步 ​