![LabVIEW性能和内存管理(中文)_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-7/10/3f25fab1-0047-4e18-943b-dcf3cbd2e046/3f25fab1-0047-4e18-943b-dcf3cbd2e0461.gif)
![LabVIEW性能和内存管理(中文)_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-7/10/3f25fab1-0047-4e18-943b-dcf3cbd2e046/3f25fab1-0047-4e18-943b-dcf3cbd2e0462.gif)
![LabVIEW性能和内存管理(中文)_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-7/10/3f25fab1-0047-4e18-943b-dcf3cbd2e046/3f25fab1-0047-4e18-943b-dcf3cbd2e0463.gif)
![LabVIEW性能和内存管理(中文)_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-7/10/3f25fab1-0047-4e18-943b-dcf3cbd2e046/3f25fab1-0047-4e18-943b-dcf3cbd2e0464.gif)
![LabVIEW性能和内存管理(中文)_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-7/10/3f25fab1-0047-4e18-943b-dcf3cbd2e046/3f25fab1-0047-4e18-943b-dcf3cbd2e0465.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LabVIEW的性能和内存管理目标目标 理解理解LabVIEW的执行系统的执行系统 学习通过以下方式提高性能学习通过以下方式提高性能: 减少数据备份减少数据备份 减少总的内存使用减少总的内存使用 理解理解VI执行属性执行属性LabVIEW的执行系统的执行系统 LabVIEW的执行系统是的执行系统是LabVIEW中负责实际运行代码的部中负责实际运行代码的部分分 支持自动并行运行支持自动并行运行 LabVIEW的独特性的独特性 其它编程语言需要手动线程管理其它编程语言需要手动线程管理LabVIEW执行系统使你的代码自动并行运行。在其它编程语言中如果需要并行运行代码必须手动管理线程,但是LabVIE
2、W的编译器和执行系统在可能的情况下一起并行运行代码。大多数情况下,执行系统的细节是无关紧要的,因为系统能够在没有干预的情况下自动优化执行程序,但有些时候了解细节有助于理解执行系统的工作方式,以便于提高程序性能。LabVIEW的执行系统的执行系统系统工作就像一个线程池系统工作就像一个线程池 程序工作就是一个队列程序工作就是一个队列 一系列线程从队列中提取程序执行代码一系列线程从队列中提取程序执行代码工作(队列元素)就是执行代码片段工作(队列元素)就是执行代码片段每一个队列就是一个执行系统每一个队列就是一个执行系统 用户界面用户界面I 标准标准 仪器仪器I/O 数据采集数据采集 其它其它1 其它其
3、它2 与调用方相同与调用方相同 定时循环定时循环LabVIEW执行系统就像一个线程池。线程池是线程的集合,共同完成从共享队列中提取的一系列工作。在LabVIEW中,工作被称为“队列元素”,每一个元素都代表一段需要被执行的VI代码。在LabVIEW中,实际上有6个执行系统,每一个系统都有自己独立的队列。此外每一个定时循环都有自己独立的执行系统。LabVIEW的执行系统的执行系统 每一个执行系统有多个线程每一个执行系统有多个线程 例外:用户界面只有一个线程例外:用户界面只有一个线程下图显示的是执行系统如何工作的模型。模型中为每一个执行系统(3个)创建了一个队列。放在队列里面的数据代表需要编译的VI
4、的执行代码。当一个VI准备运行时,LabVIEW将其放入对应执行系统的队列中。每一个执行系统有一个或多个线程。每一个线程都有一个循环,这个循环从队列中提取并执行队列元素代码。用户界面执行系统只有一个线程,但是其它的执行系统都有多个线程并共享同一个队列。当VI的代码并行运行时,代码在执行系统的不同线程中被并行处理。LabVIEW的执行系统的执行系统LabVIEW块运算块运算Clump 1Clump 2Clump 0Clump 0LabVIEW块运算块运算LabVIEW使用抢先式和合作式的多线程机制。在编译过程中,LabVIEW分析VI以定位可以在所谓的块中一起执行的节点组。每个优先级和执行系统组
5、合都有一个运行队列数据结构,保留哪些块可以一起运行。当执行系统激活线程时,执行系统从运行队列检索并执行块。当执行系统完成运行时,它在运行队列上存储满足输入条件的附加块。这就允许程序框图在任何可用的执行线程中运行。如果程序框图具有足够的并行性,则它可以在所有线程中同时执行。LabVIEW不会将代码块永久分配给特定线程。LabVIEW可以在下次运行VI时使用不同的线程执行程序块。由LabVIEW安排,每个块产生一段代码。在一个块中,LabVIEW不提供并行性。在块与块之间,LabVIEW可以使用其执行系统进行多任务。Clump 2 SleepingClump 1 SleepingClump 0 S
6、leepingLabVIEW块运算块运算Completion of diagram:Divide nodes, display of indicators, then VI exit.Start of diagram:Reads controls, then schedules Clumps 1 and 2 Then sleeps.Bottom For LoopIndicator is updatedClump 0 Scheduled Sleep.Top For LoopIndicator is updatedClump 0 Scheduled Sleep.Clump 1Clump 2Clum
7、p 0LabVIEW块运算块运算上图显示的块表示程序框图的开始和结束。当两个“循环”执行时,该块是“休眠”,同时它会被“唤醒”以结束VI(两个除法函数)。在有一个LabVIEW执行系统情况下,VI会生成执行代码。在VI的数据空间中,每个块有一个记录,称为Q元素。Q元素可以放在一个称为“runQ”的队列上,LabVIEW执行系统使用它来安排相关的代码段。休眠休眠当节点当节点“进入休眠进入休眠”时,它将自身置于等待队列上,然后返回到执行时,它将自身置于等待队列上,然后返回到执行系统系统 例如,队列,子例如,队列,子VI调用,调试等调用,调试等.当它完成等待时,从等待队列释放并放回执行队列当它完成等
8、待时,从等待队列释放并放回执行队列有时有时VI会通过停止执行并返回队列来将执行权交给其它会通过停止执行并返回队列来将执行权交给其它VI 例如,例如,While循环循环队列元素跟踪进度,以便他们可以在停止的地方重新执行队列元素跟踪进度,以便他们可以在停止的地方重新执行通常LabVIEW代码中的一个节点必须等待某些事情,然后才能继续。例如,队列或子VI可能被另一个线程使用,或者在调试时单步执行。在这些情况下,该队列元素的VI代码将被放入正在等待处理的等待队列中。在将其放入等待队列之后,VI代码返回到它正在运行的执行系统线程,以便另一段代码可以运行。这被称为协作多任务。当等待队列上的代码片段准备好再
9、次运行时,它就从等待队列中取出,然后放回到执行系统队列。最终(可能立即)该队列元素将被再次从执行队列中取出并运行。有时VI会自动停止执行,以允许其他代码运行。这是为了防止长的循环占用所有的执行时间。当这种情况发生时,VI代码简单地返回到执行系统,根据需要立即将其放回队列。在其他代码有机会运行之后,这段VI代码将再次从队列中取出并运行。每当一段VI代码由于某种原因必须进入休眠状态时,该代码的队列元素会跟踪它停止的地方,以便下次调度时它可以在同一个地方开始。首选执行系统首选执行系统 一些节点必须在一些节点必须在UI线程中运行线程中运行 每个每个VI可以指定首选的执行系统可以指定首选的执行系统 默认
10、值为默认值为“与调用者相同与调用者相同”一些节点具有首选的执行系统。最常见的首选执行系统是UI线程。一些节点必须在UI线程上运行。例如,VI中属性节点、VI 中调用节点以及VI引用节点必须在UI线程中运行。(此限制不适用于用于DAQ采集,LV类或其他类型的属性/调用节点。)另外,每个VI可以指定首选的执行系统。默认值为“与调用者相同”,这意味着VI可以在任何执行系统中运行。切换执行系统切换执行系统当节点想要运行但是在错误的执行系统中时,它使队列元素“进入睡眠”并在另一个执行系统中唤醒。这意味着代码将停止执行,并将其放在一个运行它的执行系统队列中。当其他执行系统有时间时,它会将元素拉回队列并执行
11、它。此转换需要时间,因此它可能是性能问题的原因。为了避免这种情况,应该尽量避免不必要的UI代码(如VI属性节点等),并为子VI指定首选执行系统选项为“与调用者相同”。有两种情况可能需要为VI使用特定的首选执行系统:1:如果VI有UI代码,那么该代码必须在UI线程中运行。当你使用“与调用者相同”时,可能最终运行在一个执行系统而不是UI线程。这意味着VI必须切换执行系统以获取UI线程。然后,VI必须返回到它在调用UI线程之前启动的相同执行系统,因此它将必须进行执行系统切换。如果这发生在一个循环中,那么它就会显着影响性能。如果将该VI标记为首选的UI线程,则调用者可以在调用之前切换到UI线程。这可能
12、意味着切换仅在循环之前和之后发生,而不是每次发生。2:如果VI具有长时间运行的高优先级循环,用于处理类似数据采集的任务,那么您可以将该VI标记为在其他执行系统(仪器I / O,数据采集,其他1或其他2 ),以便它不必与其他VI竞争执行系统的时间。注意,如果你不是在实时操作系统上运行,你仍然需要担心操作系统调度程序。使用定时循环来控制优先级将更可靠,并且在实时操作系统上这样做是确保您的代码以正确的优先级运行的最可靠的方法。 优先级优先级 子子VI优先级影响执行系统中该优先级影响执行系统中该VI的队列元素的优先级。的队列元素的优先级。 优先级较高的队列元素首先被执行优先级较高的队列元素首先被执行
13、优先级设置不影响执行系统线程本身的优先级:优先级设置不影响执行系统线程本身的优先级: 执行系统可能会抢占整个线程来运行线程相对于另一执行系统可能会抢占整个线程来运行线程相对于另一个执行系统(或其它进程)个执行系统(或其它进程) 使用定时循环更可靠地控制优先级。使用定时循环更可靠地控制优先级。子程序优先级子程序优先级 子程序优先级设置不是实际的优先级。它不是改变队列元素的优先级,子程序优先级使整个VI是一个单独的块,它保证在开始执行时不会进入休眠。这意味着您不能调用任何可能导致VI在子程序VI中进入休眠的功能,并且不能在VI中切换执行系统。您只能调用也标记为子程序优先级的其他子VI。在子程序VI
14、中运行的所有代码都是串行的:在子程序VI中没有并行性。 子程序还有另外一个有助于最高优先级应用程序的功能,右键单击一个子VI并且从快捷菜单中选择遇忙时忽略子程序调用,如果子程序正在另外一个线程运行时,执行系统会跳过调用。这一功能可帮助执行系统在时间紧迫的循环中安全跳过子程序的执行操作,避免了等待完成子VI而导致的延时。如果跳过了子VI的执行,所有子VI在前面板上的显示控件的输出将还原为默认值。内联内联VI 优先更换子程序优先级优先更换子程序优先级 当调用者被编译时,整个程序框图被插入调用者:零调用当调用者被编译时,整个程序框图被插入调用者:零调用开销开销 零调用开销零调用开销 仍然可以包含并行
15、性仍然可以包含并行性 允许更多的编译器优化允许更多的编译器优化 限制限制: 无前面板访问无前面板访问 不是所有节点都允许不是所有节点都允许 强制调用者在每次修改子强制调用者在每次修改子VI时重新编译时重新编译线程阻塞线程阻塞 外部代码(调用库节点,外部代码(调用库节点,CIN,.Net,ActiveX)将在调用)将在调用期间阻塞线程期间阻塞线程 C代码不使用代码不使用LabVIEW的队列元素,因此如果阻塞,则整个线程必的队列元素,因此如果阻塞,则整个线程必须等待须等待. 在等待时不能运行其他在等待时不能运行其他VI代码代码. 通常不能中止通常不能中止 请参阅调用库节点的请参阅调用库节点的“回调
16、回调”选项卡选项卡虽然LabVIEW的执行系统基于合作多线程,但是用其他语言编写的代码却不是。这意味着当你从LabVIEW调用外部代码时,代码将消耗执行线程,直到调用完成。如果外部代码因为互斥或其他原因需要等待,那么在这个过程中其他VI代码在这个执行系统线程上也就不能运行。此外,在大多数情况下,外部代码不能中止,因此如果您尝试在运行外部代码时中止VI,则必须在等待调用完成后才能完全停止VI。这是所谓的“重置VI”对话框弹出的最常见原因。如果你使用调用库节点调用C代码,那么检查CLN属性对话框的“回调”选项卡,就可以避免该问题。连线语义连线语义 每根导线都是一个缓冲内存器每根导线都是一个缓冲内存
17、器 分支创建副本分支创建副本LabVIEW数据流编程模型的值语义意味着每条线都对其自己的数据副本进行操作。子VI和内置函数还创建其数据的副本。制作副本的好处是两个代码分支可以独立操作数据。无需锁定。如何优化如何优化理论上理论上5份成为份成为1份复印操作份复印操作CopyOutput is “inplace” with input我们前面的值语义示例表明可能有多达5个副本的数组。顶部分支被标记为需要一个副本,因为它将修改数组进入+操作。底部分支被优化以使用相同的数组用于*运算和+运算符的输出。 LabVIEW已将5个副本优化为1个副本。因为有两个分支都想写回数组,因此理想的解决方案是需要复制一个
18、数组,而不管何种语言。同址操作同址操作 确定何时需要进行复制确定何时需要进行复制 数组和簇的权重高于其他类型数组和簇的权重高于其他类型 算法在执行之前运行算法在执行之前运行 不知道数组或字符串的大小不知道数组或字符串的大小 依赖于程序的顺序方面依赖于程序的顺序方面 分支机构可能需要副本分支机构可能需要副本确定何时需要进行复制的算法称为“同址”操作。该算法在VI中普遍存在并尝试找到可以减少数组和簇复制的最佳代码方式。在执行之前“同址”操作已经确定,因此就不知道一个数组是否大于另一个数组。自下而上自下而上同址信息通过调用层次结构自下而上传递同址信息通过调用层次结构自下而上传递Increments
19、array in placeCopy because of incrementNo copies requiredBranched wire显示缓冲区分配显示缓冲区分配同址优化示例同址优化示例对波形数组的每个元素进行操作对波形数组的每个元素进行操作这是一个如何使用“显示缓冲区分配”工具来提高性能的示例。从层次结构的高层开始,可以使用“显示缓冲区分配”工具查看这些波形被复制三次。为了优化这个,我们需要深入到每个子VI并修复它们,使它们同址运行。第一个子VI“同址”操作changes into这里我们可以使用元素同址操作结构使子VI“同址”执行。如果LabVIEW版本没有元素同址操作结构,那么可以
20、通过将输入波形连接到右侧束波形节点(所谓的“魔术模式”)的顶部端子来获得相同的效果。这给LabVIEW的同址操作一个提示,希望这两个波形同址操作。第二个子VI“同址”操作changes into第三个子VI“同址”操作changes into最终结果:内存缓冲点隐藏一旦打开这些子VI并修复了副本,然后保存它们(包括顶级VI),并再次使用显示缓冲区分配工具,可以验证内存缓冲点是否消失。注意,必须重新编译Vis以更新缓冲区分配显示。可以通过运行VI,保存VI或按住Ctrl键并单击运行箭头来执行此操作。元素同址操作结构元素同址操作结构七种边界操作类型七种边界操作类型: 数组索引数组索引/替换替换 数
21、组拆分数组拆分/替换子数组替换子数组 解绑解绑/捆绑簇捆绑簇 解绑解绑/捆绑波形捆绑波形 变体与元素转换变体与元素转换 原位输入原位输入/输出边界节点输出边界节点 数据值参考读数据值参考读/写写右键单击左边框或右边框以添加同址操作右键单击左边框或右边框以添加同址操作元素同址操作结构使用多个边界节点从各种数据结构中提取数据。这些节点用于从数据结构(包括数组,簇,波形和变量)中提取单个数据点。此外,同址输入输出边界节点允许同址操作传递单个值。如果无法执行在同址操作结构中编写的代码,LabVIEW会进行内存复制。数组索引/替换子子数组和数据值参考读/写节点在LabVIEW 2009中是新的。数据值引
22、用是唯一的,我们将在本节后面讨论该功能。前面板的内存问题前面板的内存问题 输入控件和显示控件有自输入控件和显示控件有自己的数据副本己的数据副本 如果前面板不在内存中,如果前面板不在内存中,则不需要内存则不需要内存 默认数据会增加内存使用默认数据会增加内存使用前面板输入控件和显示控件都有自己的数据副本,以便前面板编辑不会干扰计算。在上面所示示例中,Numeric+1与Numeric进行同址操作。如果前面板和程序框图共享此内存空间,则执行此代码后前面板将具有与Numeric +1相同的值,但是显然不是。某些控件(例如图表和表)具有存储大量默认数据的能力,这可能会增加内存使用量。 VI分析器有一个测
23、试以检测该情况是否发生在应用程序中。在调用子VI的情况下,除非需要,否则不要加载前面板。需要子VI前面板的实例将在本课后面讨论。传输内存缓冲区传输内存缓冲区Operate BufferTransfer BufferExecution Buffer 传输缓冲区保护操作缓冲传输缓冲区保护操作缓冲区和执行缓冲区之间的数区和执行缓冲区之间的数据传输据传输 仅在前面板在内存中时才仅在前面板在内存中时才更新更新CopyCopy为了保护操作和执行缓冲区之间的数据传输,LabVIEW使用传输缓冲区。当使用大型数据集并且必须对该数据显示操作时,这可能会导致更多的内存使用。传输缓冲区和执行将在第5课“优化执行速度
24、”中讨论。局部和全局变量局部和全局变量 局部变量更新数据传输缓冲区。局部变量更新数据传输缓冲区。 读取局部或全局变量会导致数据副本读取局部或全局变量会导致数据副本 尽可能使用连线传输数据尽可能使用连线传输数据请注意,在左侧的示例中,当使用连线传输数据时,只需要1个缓冲区分配。如果从控件的局部变量读取,则会进行复制。在此示例中,将有三个副本,每个副本用于读取每个局部变量。同样,如果局部变量包含一个大的簇或数组,这更为重要。请注意,即使正在读取并写入同一个变量,这也适用。局部变量永远不能同址操作,因为局部变量可能关系到传输缓冲区,同时不能对传输缓冲区进行同址操作。局部变量与局部变量与VI服务器属性
25、节点服务器属性节点局部变量局部变量 可以在任何线程中运行 复制到/从传输缓冲区 如果前面板在内存中,写入会导致第二次复制到操作缓冲区中(如果可能,请避免此操作) 当速度很重要时使用属性节点属性节点 必须在UI线程中运行 复制到/从操作缓冲区 写入导致第二副本进入传输缓冲区 强制在内存中的前面板 当需要同步显示时使用如果可能,请避免两者同时使用如果可能,请避免两者同时使用此处列出的规则显式用于VI 服务器属性节点,但它们不适用于用于DAQ,LV类等的属性节点。数据值引用数据值引用对数据的引用操作,而不是数据本身对数据的引用操作,而不是数据本身Data CopyData CopyDataRefer
26、enceReferenceReferenceTraditional dataflow: branches may create copiesBy reference: points to memory location分支线可能导致线上产生数据副本。如果多个分支修改该值,或者如果在其他分支使用原始值之前一个分支进行修改时,则会产生数据副本。数据值引用(DVR)允许您操作数据而不进行复制。这在处理性能关键型应用程序中的大型数组时特别有用。考虑这种情况:您通过电子邮件与朋友分享视频。如果您将整个视频包括在电子邮件中,朋友们会感到烦恼,因为该文件占用了他们收件箱中的空间。因此,您在线上包含视频位置的
27、链接。由于所有收件人都会在线参考相同的位置,因此所有收件者都会看到视频的最新版本(如果已修改)。数据值引用数据值引用 作为对数据的引用,而不是完整的数据本身作为对数据的引用,而不是完整的数据本身 可以保护对数据的访问可以保护对数据的访问LabVIEW 2009中引入的数据值引用和单元素队列是传输大型数据集的非常有效的方法。在第4课“优化内存”中了解有关这些结构的更多信息,值得一提的是,因为它们可用于在整个VI层次中移动大型数据集,同时最大限度地减少内存使用。重要的是要注意,必须使用元素同址操作结构来访问数据值引用的数据。内存分配内存分配如果执行以下操作,请如果执行以下操作,请预先分配数组预先分
28、配数组: 有条件地向数组添加值有条件地向数组添加值 可以确定数组大小的上可以确定数组大小的上限限对于While循环,由于数组的大小未知,故自动索引并不十分有效。但是,在While循环中使用自动索引能以较大的递增量增加输出数组的大小,从而避免每循环一次便需调整输出数组的大小。当循环执行完毕,输入数组便被调整为合适的大小。自动索引在While循环和For循环中的运行原理大体相同。自动索引假定在每轮循环有一个值添加到数组。如必须有条件地将值添加到数组,而数组大小却有其上限,可考虑预先分配数组并使用替换数组子集来填充数组。数组值填充完毕后,可将数组调整至合适的大小。数组仅创建一次,“替换数组子集”可将
29、输入缓冲区重复用于输出缓冲区。这与在循环中使用自动索引的运行原理极为相似。由于“替换数组子集”无法重新调整数组大小,故在执行该操作时,应注意进行值替换的数组的大小是否足以装入所有数据。上面的示例显示了此过程。使用上图中的方法可以避免大量的内存重新分配。替换数组子集函数有效地运行,因为它替换了预分配的数组中的值。防止内存重新分配的最佳方法是确定阵列中将有多少个元素,然后分配足够的内存。条件输入控件条件输入控件 Case结构或结构或For循环中的显示控件循环中的显示控件 防止防止LabVIEW重复使用数据缓冲区重复使用数据缓冲区特定的程序框图可阻止LabVIEW重复使用数据缓冲区。在子VI中通过一
30、个条件显示控件能阻止LabVIEW对数据缓冲区的使用进行优化。条件显示控件是一个置于条件结构或For循环中的显示控件。如将显示控件放置于一个按条件执行的代码路径中,将中断数据在系统中的流动,同时LabVIEW也不再重新使用输入的数据缓冲区而将数据强制复制到显示控件中。原因是,如果不执行该条件路径,为了更新显示控件,LabVIEW必须将默认数据传递给显示控件。如将显示控件置于条件结构或For循环外,LabVIEW将直接修改循环或结构中的数据,将数据传递到显示控件而不再复制一份数据。可为交替发生的条件分支创建常量,避免将显示控件置于条件结构内。在VI 分析器中,找到框图性能测试。在子程序测试中启用
31、有线终端以识别代码中的条件指示符。这在LabVIEW帮助的VI内存使用主题中有描述。数据空间数据空间 VI的数据存储在其数据空间中的数据存储在其数据空间中 每个每个VI都有自己的数据空间都有自己的数据空间 可重入可重入VI有多个数据空间有多个数据空间重入和数据空间重入和数据空间当VI是“可重入”时,它可以同时调用多次。它可以通过复制数据空间,使每个并发调用有自己的副本。在LabVIEW 8.5之前,我们只有两个重入的设置:打开或关闭。在8.5中,我们添加了一种称为“共享克隆”的新的重入。如果VI不可重入,则一次只能执行一次调用,因为该VI只有一个数据空间。这使得内存使用更低,并且允许VI使用未
32、初始化的移位寄存器(LV2风格全局变量的基础)在调用之间保存状态。将VI标记为可重入时,默认值为“预分配克隆”。这意味着该VI的每一次调用都有自己的唯一数据空间。因此,调用时从不必等待另一个调用执行完。然而,如果VI被多次调用和/或它具有大的数据空间,这可能导致存储器使用的大量增加。如果在标记为可重入的层次结构中有多个VI,则会产生此效果。有些情况下,有人将系统中的每个VI都标记为可重入,并且最终导致了成千上万的某些VI的克隆,最终导致LabVIEW内存不足。仔细选择要标记为可重入的VI:专注于那些经常调用并同时调用的VI。重入的新选项称为“共享克隆”,在内部通常称为“池化”重入。使用此设置,
33、VI有一个数据空间池,每个调用从池中获取一个数据空间。如果池中的所有数据空间都在使用,那么将创建一个新的数据空间并将其添加到池中。这具有不可重入和完全可重入的VI的一些好处:内存使用率较低,因为您只需要与同时调用一样多的数据空间,并且子VI调用不必等待其他调用完成。然而,他们可能不得不等待分配一个新的数据空间。缺点是存储在VI中的任何状态(例如,在移位寄存器中)与数据空间相关联,并且每个调用可能获得不同的数据空间。这使得共享重入对于全局变量是一个坏主意。使用递归时,必须将递归VI配置为使用共享克隆。这允许每个递归调用有一个新的数据空间,以便它永远不会阻塞和不使用无限内存。数据空间内容数据空间内
34、容 一个大的数据块一个大的数据块 执行系统队列元素结构执行系统队列元素结构 执行数据:执行数据: 连线连线 临时数据临时数据 移位寄存器移位寄存器数据空间内容数据空间内容两种类型两种类型: “顶层顶层” 直接存储在数据空间中直接存储在数据空间中 数字,簇,数组和字符串句柄等数字,簇,数组和字符串句柄等 “具体具体” 不直接存储在数据空间中不直接存储在数据空间中 由顶级分配引用由顶级分配引用 可以是可变长度可以是可变长度 数组和字符串内容数组和字符串内容当考虑数据空间的内容时,有时重要的是区分数据空间中的两种类型的数据。顶级数据是直接存储在数据空间中的数据。例如,数据空间中的每个数字都是数据空间
35、中的简单分配,占用该数字所需的字节数。簇也直接存储在数据空间中。但是,某些类型的数据不会直接存储在数据空间中。最值得注意的是,数组和字符串内容不存储在数据空间中。相反,数据空间本身包含一个指向实际数据的指针,它存储在其他地方。这样做使得数据可以是可变大小的。这是很重要的,因为当你使用“显示缓冲区分配”,你只看到顶级分配。点表示直接在数据空间中的分配。它们不显示何时调整数组大小,有时可能会看到一个只在错误使用情况下的分配。也就是说,不是所有的缓冲区分配点都会引起性能问题,并且也不是每个由分配引起的性能问题都会显示为缓冲区分配点。LabVIEW内存释放内存释放 当VI空闲时,LabVIEW释放许多
36、引用,而当进程关闭时,LabVIEW释放其他引用 手动关闭引用以避免不希望的内存增长,特别是对于长时间运行的应用程序当顶层VI打开的引用(本VI)空闲时或LabVIEW退出时,LabVIEW会自动关闭引用。 一些在本VI空闲时关闭的引用类型包括:文件引用,队列和ActiveX引用。 其他引用(例如VISA和IVI)在LabVIEW退出之前不会关闭。作为一个程序员,在程序运行期间关闭引用仍然是一个好方法,有下面几个原因。 如果有一个长时间运行的程序,重复打开引用而不关闭引用可能会导致内存问题,因为每个引用都需要内存。 此外,与外部代码相关的任何引用都应手动关闭,以确保以特定顺序执行关闭过程,以避
37、免崩溃和其他可能的损坏。 在大多数其他开发环境中,无法关闭引用通常会导致在关闭应用程序时发生崩溃或内存泄漏。用户界面的内存使用用户界面的内存使用 UI上的每个控件都需要内存才能存储数据结构 在运行时,控件和显示控件数据是块图数据的附加副本 控件的默认数据可能会导致不必要的内存使用 子VI 的界面通常不会有助于内存使用LabVIEW中最受忽视的内存使用区域之一是前面板。在加载前面板时,LabVIEW必须分配足够的内存来存储所有数据结构和默认数据。每个控件在框图上包含单独的数据副本,因此内存密集型应用程序应避免显示大量数据,除非需要,以避免内存不足。如果你有一个非常大的前面板有非常大的控件,如一个
38、具有30,000个元素的数组,那么该前面板需要更多的内存才能加载。大型默认数据可能会增加内存使用率和加载时间。使用VI Analyzer工具包中的“数组默认值”测试来识别默认数据不必要地对内存使用做出贡献的情况。避免为顶层VI创建单个,单片式前面板。组合功能(如子面板控件和动态加载的VI)合理使用时可减少应用程序的内存使用量。除非需要或手动加载,否则子VI通常不会将其前面板加载到内存中,因此,子VI的前面板的内存使用通常不会影响应用程序的内存使用。子子VI和内存使用和内存使用执行系统在以下条件下复制子执行系统在以下条件下复制子VI的控制和显示控件的控制和显示控件数据数据: 前面板在内存中前面板在内存中 前面板使用数据打印前面板使用数据打印 框图使用引用前面板控件框图使用引用前面板控件/显示控件的属性节点显示控件的属性节点 VI使用局部变量使用局部变量 前面板使用数据记录前面板使用数据记录如果调用子VI,只有其编译的代码被加载到内存中,除非前面板需要执行。 由于各种原因,前面板信息可能在存储器中。 其中一些项目需要内存中的前面板信息才能正常工作。 也可以将子VI配置为在调用时打开前面板。在操作菜单中,可以启用完成时打印和完成时记录。减少内存使用的提示减少内存使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新学期学习计划模板集锦九篇
- 拟合同的技巧
- 内部控制报告服务合同书
- 男女婚姻协议书范本
- 拓路前行领跑未来励志工作总结模板
- 蓝色中国风教师节主题班会模板
- 广东省汕头市潮阳新世界中英文学校2025届高三第二次教学质量检测试题物理试题含解析
- 广东省汕头市潮南区两英镇重点中学2025年初三下-第九次质量检测试题语文试题试卷含解析
- 广东省普宁市重点中学2025年初三元月调研测试化学试题试卷含解析
- 广东省陆丰市春源双语校2025届初三下期1月月考数学试题含解析
- (12)益盟操盘手全套指标公式
- 苏教版七年级数学上册知识点(详细全面精华)
- 云计算系统的实现毕业设计
- 手卫生依从性PDCA循环管理
- 环境管理物质削减计划
- 修船企业成本控制的探讨
- 《酚醛树脂》PPT课件.ppt
- 光导照明系统的介绍
- 全季酒店施工方案
- 绿化养护考核评分表
- 绿化养护报价表(共8页)
评论
0/150
提交评论