测试系统的性能对生产线的生产率和成本影响重大。运行缓慢的测试系统可能需要进行成本高昂的重复工作或减少测试覆盖范围,这两者均可能会影响质量。优化测试软件的性能可以大大缩短测试时间,并使用更少的测试站实现更全面的测试。
本文讨论了对使用NI TestStand软件开发的测试站进行性能优化的最佳实践。请务必谨记,任何解决方案都不可能完美无瑕,很难做到适用于所有测试系统。有些方法在某些测试系统中会降低性能,而在另一些测试系统中则能提高性能。在对系统实施任何更改之前和之后,请抽出时间对测试结果进行基准测试,以此评估系统的潜在优缺点。
TestStand具有多个配置选项,这些选项可能会影响性能。以下各节介绍了这些选项。
序列跟踪可提供当前操作的即时反馈和状态,例如“合格”(Pass)、“失败”(Fail)、“错误”(Error)或“跳过”(Skipped)。但序列跟踪会降低执行速度,从而影响性能。以下方法有助于提高执行速度,而且不会影响序列跟踪带来的好处。
为了在启用序列跟踪后提高性能,请将跟踪速度设置为快速,确保步骤之间不存在额外延迟。依次打开“配置”(Configure)»“测试站选项”(Station Options),使用“测试站选项”(Station Options)对话框的“执行”(Execution)选项卡对跟踪进行配置。
即使设置为最快速度,跟踪也会在每个步骤执行后花费几毫秒的时间来更新“执行视图”(Execution View)窗格。为了获得最快性能,可完全禁用跟踪。不过,如果禁用序列跟踪,则执行视图不会在执行序列时更新。
要在获得跟踪优势的同时平衡性能,请使用“序列调用跟踪设置”(Sequence call trace setting)禁用特定子序列中的跟踪。 要使用此方法,请将测试进行逻辑分组,并为每个组创建子序列。 例如,在针对移动设备的测试序列中,每个组件(例如蜂窝数据、用户输入和音频系统)的测试都可以在单独的序列中实现。对于每个组件的SequenceCall步骤,请在序列调用中禁用跟踪。
通过这种方法组织测试序列,可对顶层序列使用序列跟踪,而不会因为跟踪每个子步骤而导致性能下降。由于可以异步调用每个子序列,因此这个方法也可以方便地应用到并行测试。关于并行测试序列的更多信息,请参阅通过并行测试提高测试性能。
使用禁用跟踪的序列调用步骤来提高性能并查看执行状态
借助TestStand,可配置何时将代码模块加载到内存或从内存中卸载,这可能会对测试序列的内存使用情况和执行速度产生重大影响。如果将模块配置为在内存中保留更长的时间,则将缩短执行时间,因为在子序列执行时无需重新加载模块。 不过,如果内存中保留了太多模块,则可能会超出应用程序内存限制或可用的物理内存,这也会减慢执行速度。
理想情况下,可以对测试系统进行改进,增加内存限制,而不是卸载代码模块以节省内存。例如:
如果内存使用情况方面仍然存在问题,可以在步骤级别或序列文件级别设置“加载/卸载”(Load/Unload)选项。在大多数测试系统中,可将“打开序列文件时预加载”(Preload when opening sequence file)或“执行开始时预加载”(Preload when execution begins)选项与“序列文件关闭时卸载”(Unload when sequence file is closed)选项结合使用,从而实现卓越性能。
目标 | 理想设置 |
最大化执行次数 | 使用“打开序列文件时预加载”(Preload when opening sequence file)和“序列文件关闭时卸载”(Unload when sequence file is closed),将模块保留在内存中,直到序列关闭。 如果在内存中始终加载模块,可以提高后续调用的速度。 |
减少内存使用 | 使用“动态加载”(Load Dynamically)和“执行步骤后卸载”(Unload after Step Executes),以便在不再使用模块时从内存中删除模块。但是,由于每次执行步骤时都必须重新加载模块,因此性能会有所降低。此设置还有其他风险,例如在卸载一个代码模块时可能会丢失该代码模块中的全局数据。 |
加载较大的序列文件时,文件格式可能会影响速度和性能。借助TestStand,用户能以下列文件格式保存序列:INI、XML和二进制文件格式。
要指定用于新序列文件的格式,请执行以下操作:
要更改现有序列文件的格式,请执行以下操作:
使用二进制文件格式获得最快的序列文件加载时间
用相对路径指定序列文件和代码模块时,搜索目录配置会直接影响加载序列文件和代码模块所需的时间。搜索目录配置会影响初始加载和测试执行的性能,以及动态加载模块的后续迭代性能。可使用搜索目录配置对话框来查看和编辑搜索目录。选择“配置”(Configure)»“搜索目录”(Search Directories),打开“编辑搜索目录”(Edit Search Directories)对话框。
解析代码模块相对路径时,TestStand会遵循以下过程:
TestStand会检查搜索目录列表,解析代码模块文件的相对路径
由于每个搜索目录仅计算一个路径,因此该过程通常不会对性能造成显著影响。
但是,如果搜索目录具有“搜索子目录”(Search Subdirectories)选项,则会对指定路径内的每个子目录重复该过程。 如果路径包含较大的目录层次结构,则此选项会严重影响性能。 此外,如果层次结构中存在多个名称相同的文件,加载的文件可能有误。鉴于这些原因,应避免对添加的任何搜索目录使用此选项。 请确保使用基本搜索目录的相对路径指定所有代码模块路径。
要进一步优化搜索目录的顺序,请遵循以下准则:
在为测试系统设计目录结构时,请考虑将代码模块保存到序列文件路径下的目录或特定的代码模块位置。
TestStand可以在各种开发环境中调用代码模块,从而执行测试步骤。这些代码模块的配置和开发环境可能会对性能产生很大影响。 在任何代码模块环境中,都可以仅将必要的数据传入和传出代码模块,以此获得更好的性能。应避免传递代码模块不会访问或修改的大量数据。
在使用DLL的调试版(而非发布版)时,诸如.NET程序集或C/C++ DLL之类的编译代码模块可能会降低性能。通常,开发人员会在开发中使用调试DLL,以便更轻松地查找和纠正模块中的问题。准备好部署测试序列后,请切换到发布版DLL,以提高性能。
由于LabVIEW VI是直接执行的,因此可以在LabVIEW开发环境或LabVIEW Runtime引擎中执行。 在开发环境中运行LabVIEW VI时,可以使用调试功能对代码模块问题进行故障分析,但执行速度较慢。 要进行生产测试,请使用LabVIEW Runtime引擎来调用VI。通过LabVIEW适配器对话框,可配置用于执行LabVIEW代码的LabVIEW服务器:
为了进一步优化LabVIEW代码的加载时间,可以将代码模块VI内置到打包项目库(PPL)中。 由于PPL包含代码模块VI中所有VI依赖项的编译版本,因此LabVIEW可以更快地将依赖项加载到内存中。 另外,如果使用TestStand Deployment Utility部署代码,则可以在部署过程中为VI生成PPL。
有关结合使用PPL与TestStand Deployment Utility的更多信息,请参见使用LabVIEW打包项目库整理测试程序文件帮助主题。
利用并行测试同时完成多个测试,通常可以提升测试速度。 TestStand所提供的功能有助于并行执行单个待测设备的测试,或同时测试多个待测设备。
测试单个待测设备时,用户可以同时可测试系统的多个部分。 例如,考虑移动设备的测试序列。针对每个组件(例如蜂窝数据、用户输入和音频系统)的测试都可以在单独的子序列中实现。用户可配置序列调用步骤,异步调用序列,从而加快测试速度,而无需依次调用每个序列。
要指定应异步执行的序列调用,请执行以下操作:
在新线程中调用序列,可同时测试待测设备的不同部分
在配置异步序列调用时,请考虑使用新线程与使用新执行之间的区别:
新线程 | 新执行 |
作为调用方共享相同的结果集和报表 | 有自己的结果集和报表 |
直接执行 | 可以使用过程模型入口点执行 |
与调用方共享序列文件的全局值 | 有一个新的序列文件全局值副本 |
被调用方终止或暂停 | 独立终止或暂停 |
通常,用户应为测试序列中的相关测试使用新线程。 使用新执行的方式更适合较为独立的功能,例如应独立于测试序列运行的状态监视器。
有关选择使用新线程还是使用新执行的更多信息,请参阅在新执行中运行序列与在新线程中运行序列的区别。
要获得用于生成报表或记录数据库的异步子序列结果,请使用启动序列末尾的“等待”(Wait)步骤,等待异步序列调用完成。子序列线程完成后,TestStand会将异步子序列的结果附加到“等待”(Wait)步骤结果中,以便用于报表生成和数据库记录。要等待序列执行或线程,请在“等待”(Wait)步骤中选择“执行”(Execution)或“线程”(Thread),以便控制和指定要等待的执行或线程。 请记住,如果调用序列在线程之前完成,添加此等待可能会导致执行延迟,因此仅当需要新线程的结果时才使用此方法
使用等待步骤来获取异步序列调用的结果
除了在测试序列中使用异步调用之外,TestStand还允许使用并行和批量过程模型来并行测试多个待测设备。 这些过程模型创建了多个执行,每个执行都在单独的待测设备上运行测试序列。 可更改当前测试站或单个测试序列文件的过程模型。
使用并行和批量过程模型同时测试多个待测设备
有关并行测试如何缩短测试时间的演示,请参阅TestStand附带的并行测试策略演示
借助并行过程模型,用户可在不同的时间开始和完成待测设备的测试,而批量过程模型的设计宗旨是同时在所有待测设备上开始和完成测试序列。
除了同时开始和结束每个批量测试之外,批量过程模型还能使用批量同步步骤和设置来进一步同步批量处理中所有待测设备的测试。如果应针对所有待测设备同时运行测试的某些部分,可使用步骤设置为单个步骤定义同步部分,或者使用批量同步步骤类型为多个步骤定义同步部分。
使用批量同步,确保测试的某些部分对于批量处理中的所有待测设备都是同步的
对于所有类型的批量同步部分,所有套接字都一起进入和退出该部分。 用户可进一步将同步配置为按顺序执行或仅在单个线程中执行。
如需了解更多关于批量同步的信息,请参阅同步步骤类型 – 批量同步示例
并行测试多个待测设备时,可用的测试硬件可能会变为性能瓶颈。 使用共享硬件资源时,必须确保在任何给定时间只有一个线程在访问共享硬件资源,从而避免资源冲突。 用户通常使用“锁定”(Lock)设置或步骤类型来保留共享资源。 但如果多个线程正在等待单个资源来完成测试,那么并行测试的许多潜在性能提升将无法实现。 针对这种情况,可尝试以下方法:
借助“自动计划”步骤类型,可配置一组能以任何顺序执行的测试,从而优化测试时间和硬件利用率。 在使用并行或批量过程模型执行自动计划部分时,每个套接字都会执行不需要保留资源的第一部分。因此,同一测试的不同执行之间的执行顺序可能会有所不同
可在执行顺序不是首要考虑因素时使用自动计划程序来优化硬件利用率
如果测试执行顺序不是首要考虑因素,请使用此方法。如果测试要求按特定顺序显示测试结果,请不要使用自动计划。
TestStand附带的执行评测工具可用于识别限制测试系统执行速度的测试硬件。 依次打开“工具”(Tools)»“分析执行”(Profile Execution),从序列编辑器中启动执行评测工具。
借助执行评测器,可查看每个硬件资源处于活动状态的时间,从而针对向测试系统添加硬件所产生的影响做出明智的决策。 在下面的示例分析中,DMM得到充分利用,而示波器的利用率仅为66%。 根据此分析,添加第二个DMM或具有更多通道的DMM将会缩短此序列的测试时间。
借助执行评测工具,可直观了解哪些资源可能是测试配置中的瓶颈
通过确保以最有效的方式与硬件交互,缩短测试时间。 本节讨论管理硬件引用和测量方法以提高性能的注意事项。
对于任何给定的硬件配置,都存在一些可能会降低测试有效性的常见因素。例如,可以使用示波器来测量信号的上升时间、下降时间、RMS和峰值。如果要对示波器进行编程以捕获整个波形,请将波形传输到测试系统,然后对数据执行后处理以提取所需的测量数据,由于传输的数据量很大,因此性能将会下降。通信总线的延迟也会影响性能,因此应考虑仪器是否具有高延迟(例如LAN或串行连接)或低延迟总线(例如PCI或PXI)。
如果将示波器配置为测量上升时间、触发采集、从仪器读回上升时间并重复进行每次测量,则必须为每次测量重新配置和重新触发示波器。使用此选项,速度可能偏慢且效率低下。
鉴于许多现代示波器具有多个测量通道,请使用以下步骤来更快地执行测试:
频繁打开和关闭与硬件的会话可能会导致性能降低:在初始化与设备的通信时,许多驱动程序会传输大量数据来验证通信和配置。因此,最好在每个测试中仅初始化一次硬件,同时保持会话句柄,以便在整个测试中访问硬件。
要在测试中仅初始化一次硬件,可以使用ProcessSetup过程模型回调,该回调在所有测试代码之前运行。 对于并行和批量过程模型,无论有多少测试套接字,ProcessSetup仅执行一次。要清除引用,可以使用ProcessCleanup回调,该回调在所有测试完成后执行一次。有关创建和使用过程模型回调的更多信息,请参见在NI TestStand中使用回调。
要访问在过程模型回调中打开的硬件会话,可以使用在回调序列和MainSequence之间共享的文件全局变量。 也可以使用会话管理器,通过activeX对象自动管理硬件会话的生命周期。 如需更多关于使用会话管理器的信息,请参阅会话管理器示例。
有多种方法可以优化结果集对系统性能的影响。
对于内置结果处理器,可以选择“即时”(On-The-Fly)选项,在序列执行时(而不是在测试序列结束时)执行记录。 选择是否使用此设置时,请考虑以下优势和缺点
即时记录的优势:
即时记录的缺点:
如果用户主要是为了实现即时记录,而不太在意速度稍微变慢,可通过调整即时设置来减轻性能影响。 要访问这些设置,请执行以下操作:
为了提高性能,请增加处理间隔和/或最大结果数,从而减少TestStand记录结果的频率。
为了减少生成结果所需的时间,可将结果数据记录在离线结果文件中,该文件是一种快速紧凑的原始结果格式,其中包含TestStand生成报表或记录到数据库所需的所有信息。 由于该文件只包含原始结果数据,处理时间更短,因此可提高测试吞吐量。
使用“离线结果处理工具”可将原始结果文件处理成测试报表,或将数据记录到数据库中。由于这是一个独立的工具,可以独立于测试运行,因此可以稍后处理结果或在其他计算机上处理结果。如果保持测试系统性能的优先级高于即时生成报表,请使用此工具。如需更多相关信息,请参阅TestStand离线结果处理工具帮助主题。
尽管某些网络数据传输机制比其他机制更快,但是本地存储到硬盘驱动器的数据记录速度比存储到网络位置的记录速度更快。例如,使用Microsoft消息队列(MSMQ)与数据库进行通信,这会创建本地中间数据文件,然后通过网络进行传输。通常,这比直接写入远程数据库更快且更安全。尽管TestStand不提供使用MSMQ的原生功能,但可以使用第三方工具来实现此类通信。
另一个需要考虑的因素是记录到系统的数据量。随着记录数据量的增加,性能会有所下降。为了仅记录所需的数据,可禁用某些步骤或序列的结果记录。
通过取消选择“记录结果”(Record Result)选项(“步骤”(Step)»“属性”(Properties)»“运行选项”(Run Options)),可排除单个步骤的记录结果。也可使用“序列属性”(Sequence Properties)对话框中的“禁用所有步骤的结果记录”(Disable Result Recording For All Steps)设置,设置整个序列以排除结果记录。
在生产环境中,可能只需要知道待测设备存在失败测试,而不必具体了解是哪项测试。在此类情况下,可在第一次失败时终止测试以释放系统资源,稍后再获得更详细的故障分析。
根据测试,某些故障可能比其他故障更为严重。用户可能只希望在某些步骤失败时才终止测试。 因此,可为单个步骤或序列配置故障行为
要在特定步骤出现任何故障后结束测试,请执行以下操作:
要在特定序列出现任何故障后结束测试,请执行以下操作:
也可以为特定测试站配置此设置,例如仅在生产测试机上提前终止,而始终在生产线外的诊断机上完成完整测试。 要配置特定的测试机以在失败时终止测试,请执行以下操作: