缓慢编译Groovy脚本

同一工作流的每个运行实例之间的运行时间不一致。当用户任务之间有脚本任务时,可以观察到这种行为。通常,在部署工作流后或重新启动应用程序后第一次运行工作流时,脚本任务的执行时间较长。

导致

每个脚本任务在运行之前都必须编译。编译是将代码转换为可执行指令的过程,这可能需要一些时间。为了避免每次运行工作流时都编译相同脚本的代码,Groovy引擎有一个缓存,它将编译好的脚本存储在其中,以供将来使用。因此,已缓存的脚本的执行时间比未在缓存中的脚本短。脚本执行时间较长:

  • 您在部署工作流后第一次运行它。
  • 您在重新启动应用程序后第一次运行工作流。
  • Java垃圾收集器清除Groovy引擎缓存。通常,这种情况发生在内存不足的时候。

增加执行时间的因素

一般来说,代码越多,编译的时间就越长。当工作流包含一个大型Groovy脚本或一行中的多个脚本任务时,您就会注意到这一点,这些脚本任务没有被任何用户任务分开。

中有大量脚本代码是另一种常见情况groovy-lib目录,这样您就可以在任何Groovy脚本任务中使用该脚本中的方法。在这种情况下,即使不使用这些方法,整个内容的groovy-lib目录在编译之前添加到每个脚本任务,这增加了编译时间。

如何减少执行时间

  • 避免使用常见的groovy-lib存放不被大量任务使用的脚本的目录。将这些脚本放在工作流Groovy脚本任务中。
  • 当所有任务都可以在一个脚本任务中完成时,避免为每个API调用分割Groovy脚本任务。
  • 如果可能的话,让管理员在其他用户之前运行一次工作流,特别是在以下情况下:
    • 在部署工作流的新版本之后。运行特定的工作流。
    • 重启平台后。运行所有工作流。

    这可能会对数据产生影响。

长期解决方案

在我们的下一代平台中,我们计划改变这种行为,并在工作流部署期间编译代码,消除相同工作流实例的运行时间之间明显的不一致。