尽管LabVIEW可编译VI并生成快速执行的代码,但对于一部分时间要求苛刻的VI来说,其性能仍有待提高。本部分将讨论影响VI执行速度的因素并提供了一些取得VI最佳性能的编程技巧。
检查以下项目以找出性能下降的原因:
- 输入/输出(文件、GPIB、数据采集、网络)
- 屏幕显示(庞大的控件、重叠的控件、打开窗口过多)
- 内存管理(数组和字符串的低效使用,数据结构低效)
其他因素,如执行系统开销和子VI调用系统开销,但通常对执行速度影响极小。
输入/输出
输入/输出(I/O)的调用通常会导致大量的系统开销。输入/输出调用所占用的时间比运算更多。例如,一个简单的串口读取操作可能需要数微秒的系统开销。由于I/O调用需在操作系统的数个层次间传输信息,因此任何用到串口的应用程序都将发生该系统开销。
解决过多系统开销的最佳途径是尽可能减少I/O调用。将VI结构化可提高VI的运行性能,从而在一次调用中即传输大量数据而不是通过多次调用传输少量数据。
例如,在创建一个数据采集(NI-DAQ)VI时,有两种数据读取方式可供选择。一种方式为使用单点数据传递函数,如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,同时更新速率也通过用户界面线程而自动降低。
要实现同步显示,可右键单击该输入控件或显示控件,从快捷菜单中选择高级»同步显示,勾选该菜单项的复选框