原创 Labview中文帮助文档——性能和内存管理

2008-6-30 01:47 6471 9 10 分类: 测试测量

使用性能和内存信息窗口


性能和内存信息窗口是获取应用程序用时及内存使用情况的有力工具。性能和内存信息窗口采用交互式表格的形式,可显示每个VI在系统中的运行时间及其内存使用的情况。表格中的每一行代表某个特定VI的信息。每个VI的运行时间被分类总结。性能和内存信息窗口可计算VI的最长、最短和平均运行时间。


通过本表格可以交互的方式全部或部分显示和查看信息,将信息按类排序,或在调用某个特定VI的子VI时查看子VI运行性能的数据


选择工具?性能分析?性能和内存可显示性能和内存信息窗口。下图为一个使用中的性能和内存信息窗口。


MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/loc_env_profile_window.gif">


收集内存使用信息将明显增加VI运行时间的系统开销,因此收集内存使用信息为可选操作。须在启动性能和内存信息窗口前正确勾选记录内存使用复选框以确认是否收集这部分数据。一旦记录会话开始,该复选框便无法更改。


查看结果


可选择仅部分显示表格的信息。有些基本数据始终可见,但也可通过勾选或取消勾选性能和内存信息窗口中的相关复选框来显示各种统计数据、详情和内存使用信息(被启用时)。


全局VI的性能信息也可显示。但这部分信息有时需要略有不同的解释,如下所述。


双击表格中的子VI名可查看子VI的性能数据。此时,在各VI的名称下将立即出现新的行,显示出每个子VI的性能数据。双击全局VI的名称后,表格中将出现新的行,显示子面板上每个控件的性能数据。


单击某列列首可按想要的顺序排列表格中各行数据。按当前列排序的列首其标题将以粗体显示。


VI的计时并不一定与VI完成运行所需时间相对应。原因在于多线程执行系统可将2个或更多个VI的执行交错。另外,由于有一定数量的系统开销无法归于任何一个VI,如用户响应对话框的时间,或程序框图中等待函数所占用的时间,以及检查鼠标点击的时间等。



计时信息


勾选时间统计复选框可查看关于VI计时的其他详细信息。


勾选时间详细信息复选框可查看将VI运行总时进行细分后的计时类别。对于具有大量用户界面的VI,这些类别可帮助用户确定其中用时最多的操作。



内存信息


勾选内存使用复选框可查看VI对内存的使用情况。但该复选框仅在记录形成前勾选记录内存使用复选框后方可使用。所显示的数值表示了VI的数据空间对内存占用的程度,这部分数据空间不包括供支持所有VI使用的数据结构。VI的数据空间不仅包含前面板控件所占用的显性数据空间,还包括编译器隐性创建的临时缓冲区所占用的数据空间。


VI运行完毕后即可测得它所使用内存的大小,但可能无法反映出其确切的使用总量。例如,如VI在运行过程中创建了庞大的数组,但在运行结束前数组有所减小,则最后显示出的内存使用量便无法反映出VI运行期间较大的内存使用量。


本部分显示两组数据:已使用的字节数及已使用的块数。块是一段用于保存单个数据的连续内存。例如,一个整数数组可以为多字节,但仅占用一个块。执行系统为数组、字符串、路径和图片使用独立的内存块。如应用程序内存中含有大量的块,将导致性能(不仅是执行性能)的整体下降。


VI执行速度


尽管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,同时更新速率也通过用户界面线程而自动降低。


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



MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/note.gif">注:  同步显示仅在有必要显示每个数据值时启用。在多线程系统中使用同步显示将严重影响其性能。

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


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



在应用程序内部传递数据


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



  1. 连线-连线可传递数据并使LabVIEW最大程度地控制性能,令性能最优化。数据流语言只有一个写入器及一个或多个读取器,因而传输速度最快。
  2. 移位寄存器-移位寄存器适于需在循环中保存或反馈时使用。移位寄存器通过一个外部写入器及读取器和一个内部写入器及读取器进行数据传递。有限的数据访问令LabVIEW的效率最大化。
  3. 全局变量和函数全局变量全局变量适于简单的数据和访问。大型及复杂的数据可用全局变量读取和传递。MSITStore:\rogram%20Files\National%20Instruments\LabVIEW%208.2ch\help\lvconcepts.chm::/Suggestions_for_Exec.html">函数全局变量可控制LabVIEW返回数据的多寡。

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


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


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


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


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


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


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



并行程序框图


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


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



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


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




子VI系统开销


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


减少子VI系统开销的另一个方法是,将子VI转换为子程序,即在文件?VI属性对话框的顶部下拉菜单中选择执行,再从优先级下拉菜单中选择子程序。但这样做也有其代价。???子程序无法显示前面板的数据、调用计时或对话框函数,也无法与其他VI多任务执行。子程序通常最适于不要求用户交互且任务简短、执行频率高的VI。



循环中不必要的计算


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


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



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



结果参见下图。



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


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



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


http://www.vihome.com.cn/bbs/viewthread.php?tid=3469&extra=page%3D2

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户195748 2009-3-27 13:27

谢谢拉 好东西 正是我想要的
相关推荐阅读
jizzll_617398179 2010-02-08 10:53
正确理解A/D转换器的输入
http://www.freescale.com.cn/tech_ariticles/2005/1102_1.asp 许多嵌入式应用都会用到A/D转换器。然而,如果错误连接了A/D转换器输入端的电路,...
jizzll_617398179 2010-01-12 13:37
好久没来,都长草了
好久没来,都长草了,呵呵。整天忙得很,不过估计再过两个月会轻松点~\(≧▽≦)/~啦啦啦...
jizzll_617398179 2009-03-16 21:57
很奇怪,我收到站内信,但是却找不到发信人呢
发信人是个[],点击就跳到我自己的主页了。只好在这里给那位朋友留言了。 我不知道你说的哪篇文章,还有我也不知道你的EDN的ID。你可以在博客上面留言的。...
jizzll_617398179 2009-03-14 13:08
如何在EXCEL中使用16进制数
最近需要计算串口发送的数据,太多而且比较麻烦。知道EXECL功能强大,所以网上找了找,刚好,不错,很方便。网上找到的http://hi.bccn.net/space-99452-do-blog-id-...
jizzll_617398179 2009-03-05 14:37
〖常识〗不同晶振的最大波特率及其误差
最近犯了个错误,呵呵,晶振和波特率的问题,特查了记在这里,O(∩_∩)O~〖常识〗不同晶振的最大波特率及其误差http://www.aoxue.org/bbs/read.php?tid=65585不同...
jizzll_617398179 2009-02-11 14:30
大端模式和小端模式
转载http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则...
我要评论
1
9
关闭 站长推荐上一条 /3 下一条