缓慢编译Groovy脚本
同一工作流的每个运行实例之间的运行时间不一致。当用户任务之间有脚本任务时,可以观察到这种行为。通常,在部署工作流后或重新启动应用程序后第一次运行工作流时,脚本任务的执行时间较长。
导致
每个脚本任务在运行之前都必须编译。编译是将代码转换为可执行指令的过程,这可能需要一些时间。为了避免每次运行工作流时都编译相同脚本的代码,Groovy引擎有一个缓存,它将编译好的脚本存储在其中,以供将来使用。因此,已缓存的脚本的执行时间比未在缓存中的脚本短。脚本执行时间较长:
- 您在部署工作流后第一次运行它。
- 您在重新启动应用程序后第一次运行工作流。
- Java垃圾收集器清除Groovy引擎缓存。通常,这种情况发生在内存不足的时候。
增加执行时间的因素
一般来说,代码越多,编译的时间就越长。当工作流包含一个大型Groovy脚本或一行中的多个脚本任务时,您就会注意到这一点,这些脚本任务没有被任何用户任务分开。
中有大量脚本代码是另一种常见情况groovy-lib目录,这样您就可以在任何Groovy脚本任务中使用该脚本中的方法。在这种情况下,即使不使用这些方法,整个内容的groovy-lib目录在编译之前添加到每个脚本任务,这增加了编译时间。
如何减少执行时间
- 避免使用常见的groovy-lib存放不被大量任务使用的脚本的目录。将这些脚本放在工作流Groovy脚本任务中。
- 当所有任务都可以在一个脚本任务中完成时,避免为每个API调用分割Groovy脚本任务。
- 如果可能的话,让管理员在其他用户之前运行一次工作流,特别是在以下情况下:
- 在部署工作流的新版本之后。运行特定的工作流。
- 重启平台后。运行所有工作流。
这可能会对数据产生影响。
长期解决方案
在我们的下一代平台中,我们计划改变这种行为,并在工作流部署期间编译代码,消除相同工作流实例的运行时间之间明显的不一致。