JMeter - 何时不使用缓存编译脚本(如果可用)

JMeter - when NOT to use Cache compiled script if available

我想知道什么时候勾选Cache compiled script if available复选框是错误的,

下面Best practices有一些情况不应该使用Cache编译的脚本,但是不使用${varName}的例子是错误的,我做了一个测试,它取的值是${varName} 的更新值而不是第一个值。

When using JSR 223 elements, it is advised to check Cache compiled script if available property to ensure the script compilation is cached if underlying language supports it. In this case, ensure the script does not use any variable using ${varName} as caching would take only first value of ${varName}.

有人知道使用缓存是错误的真实案例吗?

编辑

我检查了在脚本中使用 ${varName} 并得到了类似的结果 with/without 缓存:

我在 Jmeter 中定义了名为 aa 且值为 1 的变量,并创建了一个脚本:

def aa = "2";
aa = "3";
log.info("${aa}");

值 1 在复选框的两种情况下都是 return,因此它与缓存无关

也尝试使用 Beanshell(没有 def aa = "2"; 的编译语言)并得到相同的结果。

文档的意思是,只要 ${varName} 有不同的值,就会在缓存中存储一​​个新条目,最终会用无用的数据填充它。

所以在这种情况下是错误的,${varName} 应该替换为

vars.get("varName")

事实上,如果您使用正确的 JMeter 语法,我看不到取消选中此选项的真正原因

由于上述风险以及 "non consensus" 原因,该选项默认未选中:

至于性能,无论您是否检查不支持编译的语言,它都完全相同,因为 JMeter 所做的第一件事就是在使用复选框之前检查 "supportsCompilable",请参阅:

当您使用不支持缓存编译脚本的脚本引擎时,您不应该使用缓存。由于只有 Groovy 能够编译脚本,因此您应该为 Groovy 勾选此框,为其他引擎取消勾选(每次调用脚本时都会触发无意义的代码块)

Well-behaved Groovy engine should:

  1. 运行时编译脚本,避免每次解释
  2. 缓存编译脚本以避免重新编译
  3. 重新编译脚本并在对其进行任何更改时更新缓存。

将 JMeter 函数和变量内联到脚本中对于任何语言来说都有点危险,因为它可能会解析为导致编译失败甚至更糟的结果,从而导致代码出乎您的意料。如果 Groovy JMeter 变量语法与 Groovy GString template

冲突

因此内联变量会导致每次调用脚本时都需要重新编译脚本。

因此,请继续遵循 JMeter 的最佳实践并记住一个小提示:尽可能避免编写脚本,因为 none 脚本选项的性能表现与 Java 确实如此,请查看 Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! 指南了解详细信息。