加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 01:44:29 所属栏目:大数据 来源:网络整理
导读:我正在使用spEL 4.0.0.RELEASE将http参数绑定到java对象. 我多次使用表达式解析器时会注意到一些奇怪的问题:每次调用都需要更多的时间(常量).这只发生在java 8上.在java 7上都可以. 这是示例代码: package ru.tersys.test;import java.util.ArrayList;impo

我正在使用spEL 4.0.0.RELEASE将http参数绑定到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

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

这个bug还是功能?有没有解决方法?

最佳答案
它可能与此JIRA Issue “Performance issues with SerializableTypeWrapper on Java 1.7.0_51”有关,已在4.0.1中修复.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读