QLExpress优化栈的深度
QLExpress脚本语言功能强大,通过重用QLMatchResult可以对堆栈深度进行优化,使用到QLPattern类功能。下面请看详细的例子:
public class StackOverFlowTest {
@Test
public void test() throws Exception {
String[] expressList = new String[] {
"1",
"1+2",
"max(1,2)",
"max(1,max(2,3))",
"max(1,max(2,max(3,4)))",
"max(1,max(2,max(3,max(4,5))))",
"max(1,max(2,max(3,max(4,max(5,6)))))",
"max(1,max(2,max(3,max(4,max(5,max(6,7))))))",
};
for (String express : expressList) {
QLPattern.printStackDepth = true;
QLPattern.optimizeStackDepth = false;//否认优化栈深度
ExpressRunner runner = new ExpressRunner();
IExpressContext<String, Object> context = new DefaultContext<>();
Object result = runner.execute(express, context, null, true, false);
System.out.println(express + " = " + result);
System.out.println("优化栈深度之后:");
QLPattern.printStackDepth = true;
QLPattern.optimizeStackDepth = true;//确认优化栈深度
ExpressRunner runner2 = new ExpressRunner();
Object result2 = runner2.execute(express, context, null, true, false);
System.out.println(express + " = " + result2);
QLPattern.printStackDepth = false;
}
}
}
测试结果:
优化后的栈深度明显降低。