jfinal json中的一个性能问题

JFinalJson 中有个方法

protected String toKeyValue(String key, Object value, StringBuilder sb, int depth){

    ..............

   return sb.toString(); //sb是传入的,但返回toString()

}  


而外部只有1个地方使用这个方法

protected String mapToJson(Map map, int depth) {

  ........

 sb.append('{');

while(iter.hasNext()){

            if(first)

                first = false;

            else

                sb.append(',');

            

Map.Entry entry = (Map.Entry)iter.next();

toKeyValue(String.valueOf(entry.getKey()),entry.getValue(), sb, depth);// 并没有使用到返回值,而且如果用的话,也是无用的数据

}

        sb.append('}');

return sb.toString();

}



我感觉这里会有性能问题,因为多次频繁调用 StringBuilder 的 toString 方法,

但又不使用,没有实证,请老大评估一下。

评论区

snakelenas

2017-06-24 10:11

动手测试了一下

StringBuilder sb = new StringBuilder();
long t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
sb.append(i);
}
long t2 = System.currentTimeMillis();
String s = sb.toString();
System.out.println("time:" + (t2 - t) );

1百万次 耗时40ms



StringBuilder sb = new StringBuilder();
long t = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
sb.append(i);
sb.toString(); //多加了这句代码
}
long t2 = System.currentTimeMillis();
String s = sb.toString();
System.out.println("time:" + (t2 - t) );

1百万次 耗时无法忍受,关掉了。
10万次 耗时:4758

因此把这句代码改为 return null; 无论从内存消耗,还是大量压力访问,JFinal的json性能肯定杠杠的!

JFinal

2017-06-24 10:21

JFinalJson 这段代码有五年多的历史了,当时的定位是一个简易的 json 工具,现在看来使用频度越来越大,远超原本的设计目标,是该优化一下了

感谢你的反馈

snakelenas

2017-06-24 10:22

jfianl 2.x 版本的改动方法:

@Override //覆盖同名方法
public class JFinalNewJson extends JFinalJson {
protected String toKeyValue(String key, Object value, StringBuilder sb, int depth){
sb.append('\"');
if(key == null)
sb.append("null");
else
escape(key, sb);
sb.append('\"').append(':');

sb.append(toJson(value, depth));
//基类方法return toString()导致性能问题
return null;
}
}



然后在 Config.java

@Override
public void configConstant(Constants me) {
//切入进去用JFinalNewJson 处理
JsonManager.me().setDefaultJsonFactory( new IJsonFactory() {
@Override
public Json getJson() {
return new JFinalNewJson();
}
});
}

JFinal

2017-06-24 10:28

@snakelenas 改动很小,下个版本会添加这个改进,感谢你的分享

snakelenas

2017-06-24 10:29

@JFinal 简易却不简单,您的jfinal实在太棒了!

JFinal

2017-06-24 10:33

@snakelenas 已经改进了,改成了下面的方式:
protected void toKeyValue(String key, Object value, StringBuilder sb, int depth){
sb.append('\"');
if(key == null)
sb.append("null");
else
escape(key, sb);
sb.append('\"').append(':');
sb.append(toJson(value, depth));
}

后续我也会继续留意这个 JFinalJson 的其它地方有没有可以优化的地方,暂时先优化这个地方,再次感谢 !

热门反馈

扫码入社