LabVIEW性能和内存管理 2
本文介绍LabVIEW性能和内存管理的几个建议2。
子程序优先级设置不是真正的优先级。子例程的优先级不是改变队列元素的优先级,而是使整个VI成为一个单一的集群,保证在开始执行时不会休眠。这意味着你不能在子例程VI中调用任何可能导致VI进入睡眠状态的函数,也不能在VI中切换执行系统。你只能调用其他同样标记为子例程优先级的子VI。在子例程VI中运行的所有代码都是串联发生的:子例程VI中没有并行性。
Inline Vis
Preferredreplacement for Subroutine Priority
Entire blockdiagram is inserted into caller when the caller is compiled
Zero calloverhead
Can still containparallelism
Allows for morecompiler optimizations
Limitations:
No front panelaccess
Not all nodesallowed
Forces callers torecompile every time the SubVI is modified
虽然LabVIEW的执行系统是基于协作多线程的,但用其他语言编写的代码不是。这意味着当你从LabVIEW调用外部代码时,该代码将消耗执行线程,直到调用完成。如果外部代码必须等待互斥锁或其他原因,那么在该执行系统线程等待时,就不能在该线程上运行其他VI代码。而且,在大多数情况下,外部代码不能中止,因此,如果您试图中止正在运行外部代码的VI,那么在VI完全停止之前,它必须等待调用完成。这是“重置VI”对话框的最常见原因。如果您使用调用库节点调用C代码,请查看CLN属性对话框的“回调”选项卡,以避免该问题。
Wire Semantics
• Every wire is abuffer
• Branches createcopies
LabVIEW数据流编程模型的值语义意味着每条线都操作它自己的数据副本。SubVIs和内置组件还创建其数据的副本。复制的好处是代码的两个分支可以独立地对数据进行操作。不需要锁。
通过LabVIEW进行优化
理论上的5拷贝变成了1拷贝操作。
前面的值语义示例表明,数组最多可以有5个副本。实际上,LabVIEW检查代码并发现代码的两个分支。顶部分支被标记为需要一个副本,因为它将破坏性地修改进入+操作的数组。底部分支被优化为为*运算符和+运算符的输出使用相同的数组。LabVIEW将5份副本优化为1份。这是理想的解决方案,因为无论使用什么语言,都需要复制数组,因为两个分支都希望写回数组。
决定何时需要复制的算法称为“inplace”算法。该算法遍历VI并试图找到安排代码的最佳方式,以减少数组和集群的复制。位置是在执行之前确定的,因此不知道一个数组是否比另一个数组大。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。
楼主最近还看过