使用JMH压测条件表达式性能

对于解析json表达式 groovy+spring el+aviator+mvel2压测性能比较,最终选择aviator

下面只保留aviator,主要是学会jmh的使用

最终结论

el各项性能远小于其他表达式,不予考虑

入参map的复杂度对groovy影响较大,map简单时,groovytaviator、mel快,入参较多时(实际生产场累),由于groovy解析入参占用时间较长,明显就比aviator,mel慢了

aviator, mvel难分伯仲,在实际场景用的较多的“==”运算场景和substring+'=='"运算场景,awiator略微更快些,并发方面aviator略微高于mvel;在contains函数处理方面mvel并发高于aviator

        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.36</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.36</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode.aviator</groupId>
            <artifactId>aviator</artifactId>
            <version>5.3.3</version>
        </dependency>

单线程

package com.ruoyi.common.utils;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 5,time = 5)
@Threads(1)
@Fork(1)
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class StringConnectTestSingleThread {

    private Expression aviatorCompile;

    @Param(value = "string.substring(a.b.d) == '5'")
    private String aviatorExpression;

    private Map<String,Object> env;

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(StringConnectTestSingleThread.class.getSimpleName())
                .result("result.json")
                .resultFormat(ResultFormatType.JSON).build();
        new Runner(opt).run();
    }

    @Setup
    public void setup() throws InstantiationException,IllegalAccessException{
        aviatorCompile = AviatorEvaluator.compile(aviatorExpression);
        env = new HashMap<>();
        Map<String,Object> env1 = new HashMap<>();
        Map<String,Object> env2 = new HashMap<>();
        env.put("a",1);
        env.put("b",env1);
        env.put("s","hello world");
        env1.put("c",env2);
        env1.put("d",5);
        env2.put("e",4);
        System.out.println("env=="+env);
    }

    @Benchmark
    public void testAviatorFunction(Blackhole blackhole){
        Object result = aviatorCompile.execute(env);
        blackhole.consume(result);
    }



}

多线程

package com.ruoyi.common.utils;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 5,time = 5)
@Threads(16)
@Fork(1)
@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.SECONDS)
public class StringConnectTestSingleThread {

    private Expression aviatorCompile;

    @Param(value = "string.substring(a.b.d) == '5'")
    private String aviatorExpression;

    private Map<String,Object> env;

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(StringConnectTestSingleThread.class.getSimpleName())
                .result("result.json")
                .resultFormat(ResultFormatType.JSON).build();
        new Runner(opt).run();
    }

    @Setup
    public void setup() throws InstantiationException,IllegalAccessException{
        aviatorCompile = AviatorEvaluator.compile(aviatorExpression);
        env = new HashMap<>();
        Map<String,Object> env1 = new HashMap<>();
        Map<String,Object> env2 = new HashMap<>();
        env.put("a",1);
        env.put("b",env1);
        env.put("s","hello world");
        env1.put("c",env2);
        env1.put("d",5);
        env2.put("e",4);
        System.out.println("env=="+env);
    }

    @Benchmark
    public void testAviatorFunction(Blackhole blackhole){
        Object result = aviatorCompile.execute(env);
        blackhole.consume(result);
    }



}

猜你喜欢

转载自blog.csdn.net/qq_35572013/article/details/129432043