java 8 spring spEL 可重复绑定(bind)减慢每次迭代

标签 java spring java-8 spring-el

我正在使用 spEL 4.0.0.RELEASE 将 http 参数绑定(bind)到 java 对象。 我在多次使用表达式解析器时注意到一些奇怪的问题:每次调用都需要更多时间(常量)。这只发生在 java 8 上。在 java 7 上一切正常。

示例代码如下:

package ru.tersys.test;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class Test {

public static void main(String[] args) {

    Test instance = new Test();

    Table t = new Table();
    Column c = new Column();
    t.getColumns().add(c);      

    int counter = 10;       
    while (counter-- > 0)
    {
        instance.doTest("t", t);
    }
}

ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();

public void doTest(String prefix, Object obj)
{
    Date d = Calendar.getInstance().getTime();
     int counter = 0;       
        String el = "t.columns[0].name";         

        context.setVariable(prefix, obj);
        String prefixWithDot = prefix + ".";

        int count = 400;

        while (count -- > 0)
        {
            if (el.startsWith(prefixWithDot))
            {
                parser.parseExpression("#"+el).setValue(context, "testColumnName");
                counter++;
            }
        }           
System.out.println("bind duration sec =  " + (Calendar.getInstance().getTime().getTime() - d.getTime())/1000 + " param count = " + counter);        

}




static class Table
{
    public Table()
    {
        columns = new ArrayList<>();
    }
    public ArrayList<Column> getColumns() {
        return columns;
    }
    public void setColumns(ArrayList<Column> columns) {
        this.columns = columns;
    }
    private ArrayList<Column> columns;

}

static class Column
{
    public Column()
    {

    }
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

}

jdk 8 输出:

bind duration sec =  1 param count = 400
bind duration sec =  3 param count = 400
bind duration sec =  5 param count = 400
bind duration sec =  7 param count = 400
bind duration sec =  9 param count = 400
bind duration sec =  12 param count = 400
bind duration sec =  14 param count = 400
bind duration sec =  16 param count = 400
bind duration sec =  19 param count = 400
bind duration sec =  22 param count = 400

Java 7 输出:

bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400
bind duration sec =  0 param count = 400

这是错误还是功能?有什么解决方法吗?

最佳答案

关于java 8 spring spEL 可重复绑定(bind)减慢每次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24575507/

相关文章:

java - 异常.getmessage() 返回 null

java - 测试读写文件系统的类时的单元测试最佳实践

spring - 我应该将 Spring applicationContext.xml 保存在 EAR 中的哪里

java web应用布局,请解释一些设计原则/模式

java.lang.NoClassDefFoundError : Could not initialize class sun. text.normalizer.NormalizerImpl

java - 使用 Java 8 模块的 Gradle Android 项目

java - Vertx 追加到文件

java - 如何配置 Spring 以使用 TransactionManager

java - 推断类型不符合上限

java - 有没有办法将默认构造函数添加到接口(interface)