LabVIEW执行速度

简介: LabVIEW执行速度

abVIEW执行速度


尽管LabVIEW可编译VI并生成快速执行的代码,但对于一部分时间要求苛刻的VI来说,其性能仍有待提高。本部分将讨论影响VI执行速度的因素并提供了一些取得VI最佳性能的编程技巧。


下列原因可能导致执行速度下降:


输入/输出(文件、GPIB、数据采集、网络)


屏幕显示(庞大的控件、重叠的控件、打开窗口过多)


内存管理(数组和字符串的低效使用,数据结构低效)


编译器优化(在编辑器响应事件和VI执行速度之间实现最佳平衡点)


其他因素,如执行系统开销和子VI调用系统开销,但通常对执行速度影响极小。


输入/输出


输入/输出(I/O)的调用通常会导致大量的系统开销。输入/输出调用所占用的时间比运算更多。例如,一个简单的串口读取操作可能需要数微秒的系统开销。由于I/O调用需在操作系统的数个层次间传输信息,因此任何用到串口的应用程序都将发生该系统开销。


解决过多系统开销的最佳途径是尽可能减少I/O调用。将VI结构化可提高VI的运行性能,从而在一次调用中即传输大量数据而不是通过多次调用传输少量数据。


例如,在创建一个数据采集VI (NI-DAQmx)时,有两种数据读取方式可供选择。一种方式为使用单点数据传递函数,如AI Sample Channel VI,另一种方式为使用多点数据传递函数,如AI


Acquire Waveform VI。如必须采集到100个点,可用AI Sample Channel VI和“等待”函数构建一个计时循环。也可用AI Acquire Waveform VI,使之与一个输入连接,表示需要采集100个点。


AI Acquire Waveform VI通过硬件计时器来管理数据采集,从而使数据采样更为高速精确。此外,AI Acquire Waveform VI的系统开销与调用一次AI Sample


Channel VI,的系统开销大体相等,但前者所传递的数据却多得多。


屏幕显示


在前面板上频繁更新控件是最为占用系统时间的操作之一。这一点在使用图形和图表等更为复杂的显示时尤为突出。尽管多数显示控件在收到与原有数据相同的新数据时并不重绘,但图表显示控件在收到数据后不论其新旧总会重绘。如重绘率过低,最好的解决方法是减少前面板对象的数量并尽可能简化前面板的显示。对于图形和图表,可关闭其自动调整标尺、调整刻度、平滑线绘图及网格等功能以加速屏幕显示。


对于其他类型的I/O操作,显示控件均占用一部分固定的系统开销。图表等输入控件可将多个点一次传递到输入控件。每次传递到图表的数据越多,图表更新的次数便越少。如将图表数据以数组的形式显示,可一次显示多点而不再一次只显示一个点,从而大幅提高数据显示速率。


如设计执行时其前面板为关闭状态的子VI,则无须考虑其显示的系统开销。如前面板关闭则控件不占用绘制系统开销,因此图表与数组的系统开销几乎相同。


多线程系统中,可通过高级?同步显示的快捷菜单项来设置是否延迟输入控件和显示控件的更新。在默认状态下,输入控件和显示控件均为异步显示,即执行系统将数据传递到前面板输入控件和显示控件后,数据可立即执行。显示若干点后,用户界面系统会注意到输入控件和显示控件均需要更新,于是重新绘制以显示新数据。如执行系统试图快速地多次更新控件,用户可能无法看到介于中间的更新状态。


多数应用程序中,异步显示可在不影响显示结果的前提下显著提高执行速度。例如,一个布尔值可在一秒内更新数百次,每次更新并非人眼所能察觉。异步显示令执行系统有更多时间执行VI,同时更新速率也通过用户界面线程而自动降低。


要实现同步显示,可右键单击该输入控件或显示控件,从快捷菜单中选择高级?同步显示,勾选该菜单项的复选框。


注:  同步显示仅在有必要显示每个数据值时启用。在多线程系统中使用同步显示将严重影响其性能。


延迟前面板更新属性可延迟所有前面板更新的新请求。


调整显示器设置和前面板控件也可提高VI的性能。可将显示器的色深度和分辨率调低,并启用硬件加速。关于硬件加速的详细信息,参见所使用操作系统的相关文档。使用来自经典选板而不是新式的控件也可提高VI性能。


内存管理


管理VI占用的内存时,请考虑下列建议以实现最高的效率。


避免频繁改变数据占用的空间,LabVIEW就不必对数据进行多次备份。


开发有效的数据结构与特定数据类型配合使用,避免冗余数据备份。


在当前版本LabVIEW中保存VI时,不分离编译代码。


编译器优化


要改进大型VI的编辑器响应速度,LabVIEW编译器会限制提高VI执行速度的各项优化。开发大型VI结束后,可配置LabVIEW将执行速度的优先级置于编译器响应之前。也可配置LabVIEW在程序生成中使用完整的编译器优化策略。


在应用程序内部传递数据


在LabVIEW应用程序内传递数据有多种方式。下表为常见的数据传递方法,按其效率排序。


连线-使用连线传递数据并使LabVIEW控制性能优化。在数据流语言中,数据只有一个写入器但有一个或多个读取器,因而传输速度最快。


反馈节点-使用反馈节点可保存由上一个VI或循环执行而得的数据。如启用了选项对话框程序框图页上的在循环中自动插入反馈节点,则将一个或一组子VI或函数的输出端与其自身的输入端连接时,将自动出现一个反馈节点。LabVIEW默认为启用在循环中自动插入反馈节点。反馈节点将扣留VI或函数最近一次执行得到的数据,接着将数据传递到下一次执行,或者视初始化接线端是否被移动而设置一个新的初始值。循环中的移位寄存器与反馈节点保存数据的方式相同,但移位寄存器需要连线以连通整个循环。


移位寄存器-移位寄存器适于需在循环中保存或反馈时使用。移位寄存器通过一个外部写入器及读取器和一个内部写入器及读取器进行数据传递。有限的数据访问令LabVIEW的效率最大化。反馈节点可取代移位寄存器达到相等功能,且无需使用连线连通整个循环。


全局变量和函数全局变量-全局变量适于简单的数据和访问。大型及复杂的数据可用全局变量读取和传递。函数全局变量可控制LabVIEW返回数据的多寡。


控件、控件引用和属性节点可作为变量使用


尽管控件、控件引用和属性节点皆可用于VI间的数据传递,但由于其必须经由用户界面,因此并不适于作为变量使用。一般仅在进行用户界面操作或停止并行循环时才使用局部变量和“值”属性。


用户界面操作通常速度较慢。LabVIEW将两个值通过连线在数纳秒内完成传递,同时用数百微秒到数百毫秒不等的时间绘制一个文本。例如,LabVIEW可把一个100k的数组通过连线在0纳秒到数微秒内将其传递。绘制该100k数组的图形需要数十毫秒。由于控件有其用户界面,故使用控件传递数据将产生重绘控件的副作用,令内存占用增加,VI性能降低。如控件被隐藏,LabVIEW的数据传递速度将提高,但由于控件可随时被显示,LabVIEW仍需更新控件。


多线程对用户界面操作的影响


完成用户界面操作一般占用内存更多,其原因在于LabVIEW需将执行线程切换到用户界面线程。例如,设置“值”属性时,LabVIEW将模拟一个改变控件值的用户,即停止执行线程并切换到用户界面线程后对值进行更改。然后,LabVIEW更新保存控件数据的操作缓冲区,如前面板窗口打开,则重新绘制控件。LabVIEW随后便把数据发送到执行线程。执行线程位于称作传输缓冲区的受保护内存区域内。最后LabVIEW将切换回执行线程。当执行线程再次从控件读取数据时,LabVIEW将从传输缓冲区寻找数据并接收保存程序框图数据的执行缓冲区的新值。


将数据写入局部或全局变量时,LabVIEW并不立即切换到用户界面线程。而是把数值写入传输缓冲区。用户界面将在下一个指定的更新时间进行更新。变量更新可能在线程切换或用户界面更新前多次进行。原因在于变量仅可在执行线程中运算。


函数全局变量不使用传输缓冲区,因此可能比一般的全局变量更高效。函数全局变量仅存在于执行线程中,除非需在打开的前面板上显示其数值,一般无需使用传输缓冲区。


并行程序框图


有多个程序框图并行运行时,执行系统将在各程序框图间定期切换。对于某些较为次要的循环,等待(ms)函数可使这些次要循环尽可能少地占用时间。


例如,考虑以下程序框图。


d0f5d9fc1d2acc08c3724514c7d415f0.png

有两个并行的循环。循环一用于采集数据且需要尽可能频繁地执行。循环二用于监测用户的输入。由于程序编写的原因,这两个循环使用同等长度的时间。可令检测用户操作的循环在一秒内运行数次。


事实上,令该循环以低于每半秒执行一次的频率执行同样可行。在用户界面循环中调用等待(ms)函数可将更多执行时间分配给另一个循环。

22a1c85d6ad99a3e86c7a412b16a2bf9.png

并行For循环


LabVIEW按照顺序执行For循环。如使用For循环处理大量计算,可并行运行For循环以提高执行速度。LabVIEW可通过并行循环利用多个处理器提高For循环的执行速度。但是,并行运行的循环必须独立于所有其它循环。通过查找可并行循环结果对话框确定可并行的For循环。右键单击For循环外框,在快捷菜单中选择配置循环并行,打开For循环并行迭代对话框,启用并行循环。


启用并行循环执行后,总数接线端下方将出现一个并行接线端,如下图所示。可使用该接线端指定LabVIEW使用的循环实例数量,以及确定某次特定循环中运行的实例。


启用For循环的并行执行之前,请先参考关于执行性能的意见和建议。


建议在错误列表中显示警告,当并行执行循环导致VI中的问题时,LabVIEW会及时向用户发出警告。


子VI系统开销


调用子VI需占用一定数量的系统开销。与历时数毫秒至数十毫秒的I/O系统开销和显示系统开销相比,该系统开销极为短暂(数十微秒)。但是,该系统开销在某些情况下会有所增加。例如,在一个循环中调用子VI达10000次后,其系统开销将对执行速度带来显著影响。此时,可考虑将循环嵌入子VI。


减少子VI系统开销的另一个方法是,将子VI转换为子程序。在VI属性对话框的类别下拉菜单中选择执行,然后从优先级下拉菜单中选择子程序。但是,有取必有舍。子程序不显示前面板的数据、调用计时或对话框函数,不允许调试和自动错误处理,无法与其他VI实现多任务执行。子程序通常最适于不要求用户交互且任务简短、执行频率高的VI。


第三种减小子VI系统开销的方法是将子VI嵌入其调用方VI。嵌入子VI就是将子VI的编译代码嵌入调用方VI的编译代码。如要对子VI进行修改,LabVIEW将重新编译子VI的所有调用方VI,以应用改动。内嵌子VI从本质上减少了运行时调用子VI的需求。LabVIEW在调用方VI的编译代码内执行子VI的代码。


内嵌子VI适用于较小的子VI、循环内部的子VI、未连接输出的子VI、仅调用一次的子VI,等等。如要内嵌子VI,勾选VI属性对话框执行页的在调用VI中内嵌子VI复选框。还必须选择对话框中的预分配的副本重入执行选项。LabVIEW自动为每个嵌入的子VI分配克隆实例。


要嵌入的子VI不能有下列特征:


包含递归算法


使用自动错误处理


程序框图包含属性节点和调用节点如启用子VI嵌入,上述节点会产生编辑时错误。


允许调试。必须要将嵌入的子VI禁用调试。


是下列VI的一种:


LabVIEW类的动态分配成员VI


终端为CGen或FPGA的VI


控件VI,自定义的控件


多态VI


全局变量VI


XControl VI


XControl库的方法VI


只能置于LabVIEW Control Design and Simulation模块模拟框图上的VI


即使子VI没有上述特征,在下列调用情况下,LabVIEW不会内嵌子VI:


动态调用子VI


调用启用了数据库访问的子VI


另外,内嵌子VI时,LabVIEW会忽略优先级和优先执行选项。


关于内嵌子VI带来的性能改进,请参考examples\Performance\VI


Properties目录下的VI Execution Properties VI。


共享变量开销


网络发布的共享变量会显著增加CPU和内存的开销。如应用程序中有大量网络发布的共享变量,考虑使用Simple Messaging Reference Library (STM)。


如要从一台计算设备连续发送数据流至另一台计算设备,可使用网络流函数。


循环中不必要的计算


如计算在每次循环后的结果相同,应避免将其置于循环内。正确的做法是将计算移出循环,将计算结果输入循环。


例如,考虑以下程序框图。

循环中每次除法计算的结果相同,故可将其从循环中移出以提高执行性能。如下列程序框图所示。


如全局变量的值不会被这个循环中另一个同时发生的程序框图或VI更改,那么每次在循环中运行时,该程序框图将会由于全局变量的读写而浪费时间。


如不要求全局变量在这个循环中被另一个程序框图读写,可使用以下程序框图。


注意,移位寄存器必须将新的值从子VI传递到下一轮循环。以下程序框图显示了一个常见于初学者的错误。由于未使用移位寄存器,该子VI的结果将永远无法作为新的输入值返还给子VI。

91ae7bfa36d143378bebfb320601a0ee.png

上文中提到的例子和资料,均在word中的附件里,可点击下载。


   需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目问题,可联系我们。

相关文章
|
5天前
LabVIEW执行串行回送测试
LabVIEW执行串行回送测试
|
5天前
|
人机交互
LabVIEW编程LabVIEW开发控制阿尔泰DAM-3948D例程与相关资料
LabVIEW编程LabVIEW开发控制阿尔泰DAM-3948D例程与相关资料
10 0
|
5天前
|
编解码
LabVIEW编程LabVIEW控制Keithley 2420例程与相关资料
LabVIEW编程LabVIEW控制Keithley 2420例程与相关资料
|
5天前
LabVIEW编程LabVIEW控制WNSC600运动控制器例程与相关资料
LabVIEW编程LabVIEW控制WNSC600运动控制器例程与相关资料
14 1
|
5天前
|
API
LabVIEW编程LabVIEW控制PXI-5122例程与相关资料
LabVIEW编程LabVIEW控制PXI-5122例程与相关资料
16 1
|
5天前
|
存储 编解码
LabVIEW编程LabVIEW控制picoharp 300例程与相关资料
LabVIEW编程LabVIEW控制picoharp 300例程与相关资料
10 0
|
5天前
|
安全 网络安全 数据安全/隐私保护
LabVIEW编程LabVIEW控制cRIO-9043例程与相关资料
LabVIEW编程LabVIEW控制cRIO-9043例程与相关资料
11 0
|
5天前
|
C语言 C++ 开发者
LabVIEW调用C/C++ DLLs
LabVIEW调用C/C++ DLLs
10 0
|
5天前
|
编解码 算法 关系型数据库
LabVIEW编程LabVIEW开发 控制FlukePG7000例程与相关资料
LabVIEW编程LabVIEW开发 控制FlukePG7000例程与相关资料
13 0
|
5天前
|
测试技术
LabVIEW程序测试
LabVIEW程序测试
http://www.vxiaotou.com