提升LabVIEW程序性能的若干编程技巧.ppt
文本预览下载声明
提升LabVIEW程序性能的若干编程技巧 概述 基于事件驱动的编程机制 LabVIEW程序内存管理 动态调用VI 类型转换 内存重新分配 用户接口性能 自动静态代码分析 LabVIEW中基于事件驱动的编程 LabVIEW事件示例 按下鼠标 键盘按键 前面板的用户交互 LabVIEW 事件结构 什么是事件结构? 带有多个子框图的结构节点, 就像条件结构 事件结构是如何工作的? 当面板上事件发生时才被唤醒 自动执行相应事件框图内的事件代码 当处理完成相应事件后便结束,并不一直循环等待 为什么要使用事件结构 ? 用更简单的事件处理替代原来的查询循环 最小化 CPU 的使用 不会遗漏用户界面交互事件 可检测更多的交互事件 编程生成您自己的事件 使用事件结构模板 状态机 并行循环VI架构 队列信息处理器 生产者/消费者 (数据) 用户接口事件处理器 生产者/消费者 (事件) 根据需要组合或扩展各种结构 演示1: LabVIEW 事件结构编程 内存管理措施:提高程序性能的关键 将VI分为多个子VI 监测内存分配状况以定位问题 适时选择动态调用子VI 减少数据备份和内存重新分配 尽可能减少前面板刷新 监测VI性能和内存 监测VI执行时间和内存占用 在程序中动态加载VI ——减少程序占用内存以及载入时间 打开VI引用 通过引用节点调用 关闭引用 典型的VI层次 配置 VI加载– LabVIEW 8.20 调用库函数的改进 在LabVIEW 8.20中动态加载和卸载DLL 演示2: 动态加载 VI 类型转换 强制点表明连接了两种不同的数据类型 LabVIEW中类型强制需要数据备份 涉及大数组的类型强制会占用大量内存 推荐的类型转换方式 更好的解决方式是在随机数创建时进行转换 避免转换大块数据缓存 自定义类型强制点 创建数组和字符串 过多进行内存重新分配占用很大开销 需要限制可能导致内存重新分配的相关函数 创建数组 连接字符串 18.7秒内创建一个数组 非常慢 因为每个循环都涉及内存重新分配 0.42秒内创建一个数组 快很多 因为仅有单个内存分配 0.40秒内创建一个数组 最快也是最简洁的方法 查看缓冲区分配 显示缓冲区分配 显示程序中内存分配的位置 演示3:LabVIEW 内存分配 提高用户接口性能 输入和显示控件属性以及调用节点都会降低应用程序速度 设计subVI 的前面板在执行中保持关闭来减少显示开销 强制线程转换为UI线程 可以在完成时强制UI更新 线程转化回初始线程 首选的用户界面更新方法 使用 延迟前面板刷新 在多刷新时禁止前面板 演示4:线程交换 LabVIEW VI 分析器工具 LabVIEW工具包附件* 通过60+ 的可配置测试自动分析代码 性能 分格 交互式的检测错误 生成定制报表 VI 分析器—— 与性能相关的测试 循环内数组和字符串 强制点 使能的调试 While循环中的等待 VI的大小 数组默认值 结构体里面隐藏的对象 全局变量和局部变量 未使用代码 子程序框图内已连线的接线端 顺序结构的使用 演示5:VI 分析器工具 总结 使用事件驱动编程将处理器占用降到最低 动态加载VI改进内存占用和初始加载时间 减少内存重新分配和线程交换以提高运行速度 通过自动代码检测定位性能问题 In LabVIEW 8 and 8.20, you can dynamically load a VI by simply placing it on the block diagram, right-clicking on it and selecting Call Setup from the right-click menu. From the resulting dialog window, you can change how the VI is loaded (see image). As explained previously, LabVIEW loads VIs when the caller is loaded. However, this can be changed to ‘Reload for each call’ or ‘Load and retain on first call’ (also known as “lazy loading”). Using the Call Setup feature, you can easily reduce your LabVIEW memory footprint at any given point in the execution of your application by c
显示全部