`
javamonkey
  • 浏览: 166883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Beetl 性能揭秘 1 :如何输出一个整型变量

阅读更多

常规来说,IO流提供了输出字符串(字符数组)的功能,所以,通常的整型输出应该是这样的代码:
String str = String.valueOf(12);
out.write(str);


对于模板引擎来说,输出整形变量很常见,事实上,这个地方有非常大的性能提高空间。我们只要分析这俩句话的源码,就能看出,如何提高io输出int性能。

对于第一句 String.valueOf 实际上调用了Integer.toString(int i) 方法,此方法原代码如下
public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}


我们注意到,代码第5行分配了一个数组,对于任何一个高效的java工具来说,这都是个告警消息,分配数组耗时,垃圾回收也耗时

我们在分析out.write(str);代码,对于输出一个字符串,必须将字符串先转为字符串数组( 看到问题没有,这又回去了),熟悉String源码的同学都知道,这仍然是一个耗时操作,我们看一下源代码:

public char[] toCharArray() {
    // Cannot use Arrays.copyOf because of class initialization order issues
    char result[] = new char[value.length];
    System.arraycopy(value, 0, result, 0, value.length);
    return result;
}


如上代码,我们又发现了一次分配空间的操作,而且,还有一次字符串拷贝 System.arraycopy,这俩部又成了耗时操作

综合上面代码,我们就会发现,简单的一个int输出,除了基本的算法代码外,居然有俩次字符串的分配,还有一次数组copy。难怪性能低下(性能测试中确实这也是个消耗较多cpu的地方)。那么Beetl是如何改善的?

Beetl提供了一个专门的类IntIOWriter来处理字符串输出,如下关键代码片段:

public static void writeInteger(ByteWriter bw, Integer i) throws IOException
{

    if (i == Integer.MIN_VALUE)
    {
        bw.writeString("-2147483648");
        return;
    }

    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = bw.getLocalBuffer().getCharBuffer();
    getChars(i, size, buf);
    bw.writeNumberChars(buf, size);

}


如上代码,首先,我们可以看倒数第三行,并未分配字符素组,而是得到跟当前线程有关的一个char[]
其次,代码最后一行,直接就将此数组输出到IO流了,干净利索

综上所述,常规的输出int方法,除了常规算法外,需要俩次数组分配,和一次字符串拷贝操作。而Beetl则只需要常规算法即可输出,节省了俩次数组分配以及一次字符串copy操作。难怪性能这么好!

分享到:
评论

相关推荐

    springboot+beetlsql使用案例

    springboot+beetlsql使用案例: 优点:(1) 无需注解,能自动使用大量的内置sql,快速完成增,删,改,查的功能 (2)数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型 (3)SQL模板基于B eetl实现,更...

    Spring+SpringMVC+Ehcache+Shiro+BootStrap企业级开发平台

    1、后端 核心框架:Spring Framework 安全框架:Apache Shiro 视图框架:Spring MVC 服务端验证:Blade Validator 任务调度:Spring Task 持久层框架:beetlsql 模板引擎:beetl 数据库连接池:Alibaba ...

    beetl-2.5.2-API文档-中文版.zip

    赠送jar包:beetl-2.5.2.jar; 赠送原API文档:beetl-2.5.2-javadoc.jar; 赠送源代码:beetl-2.5.2-sources.jar; 赠送Maven依赖信息文件:beetl-2.5.2.pom; 包含翻译后的API文档:beetl-2.5.2-javadoc-API文档-...

    beetlsql-2.6.7-API文档-中文版.zip

    赠送jar包:beetlsql-2.6.7.jar; 赠送原API文档:beetlsql-2.6.7-javadoc.jar; 赠送源代码:beetlsql-2.6.7-sources.jar; 赠送Maven依赖信息文件:beetlsql-2.6.7.pom; 包含翻译后的API文档:beetlsql-2.6.7-...

    beetl自动配置Spring启动beetl-spring-boot.zip

    beetl-spring-boot-starter,beetl 自动配置 Spring 启动。使用:从 maven 导入该库  &lt;groupId&gt;com.piggsoft&lt;/groupId&gt;  &lt;artifactId&gt;beetl-spring-boot-starter  &lt;version&gt;0.0.1 配置 application....

    springboot+beetl+beetlsql

    使用springboot+beetl+beetsql+mysql集成的一个demo,实现增删改查,beetl模板调用。

    基于beetl的java后台模板

    每个层对应一个main方法,这里面所有的main执行完后,就生成结束了 5.当然,也可以不用我的,你们也可以根据需求修改成自己的工具 6.com.edu.cn.config下是一些重要的加载配置 7.com.edu.cn.otherUtil主要是输出文件...

    MF00716-Java企业级开发平台源码.zip

    1、后端 核心框架:Spring Framework、安全框架:Apache Shiro 视图框架:Spring MVC、服务端验证:Blade Validator 任务调度:Spring Task、持久层框架:beetlsql、模板引擎:beetl 数据库连接池:Alibaba ...

    beetlsql.zip

    6个使用beetlsql实例源码,最近使用beetlsql越来越多,它的使用比mybatis更方便,所以这里特点写了几个练手的源码供大家学习使用

    beetl-2.7.14.jar

    beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar beetl-2.7.14.jar

    springboot+beetl+mybatis

    springboot+beetl+mybatis

    beetl模版引擎文档

    beetl模版引擎文档, 方法

    spring boot+beetl+beetlsql源代码

    springboot整合beetl/beetlsql,搭建springboot+beetl+beetlsql环境

    BeetlSQL数据库访问框架是一个全功能 DAO 工具,同时具有 Hibernate.rar

    BeetSql是一个全功能DAO工具,同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 在开发效率上,无需注解,自动使用大量内置SQL,轻易完成增删...

    beetlsql-2.6.7-API文档-中英对照版.zip

    赠送jar包:beetlsql-2.6.7.jar; 赠送原API文档:beetlsql-2.6.7-javadoc.jar; 赠送源代码:beetlsql-2.6.7-sources.jar; 赠送Maven依赖信息文件:beetlsql-2.6.7.pom; 包含翻译后的API文档:beetlsql-2.6.7-...

    Beetl模板引擎入门教程.pdf

    Beetl是一款6倍于Freemarker的超高性能的java模板引擎,来自于中国!!BeetlSQL是一款功能强大,以SQL为中心,使用简单的全功能的ORMapping工具,支持自动生成代码

    开源bbs源码java-jfinal-bbs:一个开源,为了让更多人接触并喜欢上jfinal和beetl而制作的BBS:采用了简洁而强大的JF

    /开发的一个简单的BBS, ^O^ 希望它作为一个JFinal, Beetl和Rythm入门的DEMO,可以帮到新人。 最后,向开源前辈们致敬。 部署完毕的效果地址是: 运行方法:导入sql,编译整个项目,配置相应的参数,运行Config.java...

    SpringBoot集成Beetl的简单测试

    SpringBoot集成Beetl的简单测试 @Configuration public class BeetlConfiguration { @Bean(initMethod = "init", name = "beetlConfig") public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration...

    Spring Boot集成Beetl简单demo

    Spring Boot集成Beetl简单demo,更加清晰用法。了解项目如何配置。

    beetl模板语音教学

    beetl模板语音教学,方便,不占内存,不信试试

Global site tag (gtag.js) - Google Analytics