为什么80%的码农都做不了架构师?>>>   

常规来说,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 issueschar 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操作。难怪性能这么好!

备注:本文提供的技术并非是Beetl独有技术,只做技术分享而已

转载于:https://my.oschina.net/xiandafu/blog/284823

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

  1. [JAVA]使用if…else语句编写代码。定义一个整型变量a,为其赋值为20,判断20是奇数还是偶数,如果为奇数,输出“a是奇数”,否则输出“a是偶数”

    使用if-else语句编写代码.定义一个整型变量a,为其赋值为20,判断20是奇数还是偶数,如果为奇数,输出"a是奇数",否则输出"a是偶数" public c ...

  2. 计算机专业显卡,NVIDIA专业计算机显卡QuadrO性能揭秘.doc

    NVIDIA专业显卡Quadro性能揭秘Quadro走亲民路线 NV携GeForce双管齐下NVIDIA作为一个走在视觉处理前沿阵地的硬件厂商,其民用级显卡上拥有很高的知名度,也许很多消费者不知道这个 ...

  3. 用python中函数输出杨辉三角_用Python输出一个杨辉三角的例子

    这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...

  4. python输出杨辉三角啊二维数组_用Python输出一个杨辉三角的例子

    这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...

  5. 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?

    试题描述 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少? 输入格式 一个整型范围内的整数,即初始时整型变量的值. 输出格式 一个整数,经过上述过程后得到 ...

  6. ACMNO.34 C语言-格式输出 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用6.2f格式输出。

    题目描述 请设计输出实数的格式, 包括: ⑴一行输出一个实数:⑵一行内输出两个实数:⑶一行内输出三个实数. 实数用"6.2f"格式输出. 输入 一个实数,float范围 输出 输出 ...

  7. c语言:输出一个菱形图

    输出一个菱形图. 解:程序: #include<stdio.h> int main() { int i, j; char diamond[][5] = { {' ',' ','*'},{' ...

  8. MODE —— 输出一个高度和宽度固定的方框(知识点:for循环嵌套for循环)

    问题描述: 终端输入,需要的图形的高度和宽度,绘制图形. 运行结果: 代码部分: #include <stdio.h> int main() {unsigned int width = 0 ...

  9. C语言经典例73-反向输出一个链表

    目录 1 题目 2 分析 2.1 方法1-原地逆置 2.2 方法2-递归 3 实现 3.1 实现1-原地逆置 3.2 实现2-递归 4 运行结果 1 题目 反向输出一个链表,链表结构为: typede ...

最新文章

  1. LeetCode 报错解决 heap-buffer-overflow Heap-use-after-free Stack-buffer-overflow Global-buffer-overflow
  2. 软件构架实践读书笔记二
  3. python列表按照指定顺序排序-python列表排序、字典排序、列表中字典排序
  4. 0.为什么要学习Vue?
  5. Android 对okhttp的封装
  6. 使用 “vue-cropper“进行图片裁剪
  7. linux重启kvm服务命令,linux中kvm的安装及快照管理
  8. 【PAT天梯】【L2-2 小字辈(左子右兄加强版)】(树,水题)
  9. java 最优算法_java 问题 求个最优算法
  10. swift面向对象之属性
  11. mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.
  12. 王道 —— 进程同步、进程互斥
  13. 【Vue-router中,require代替import解决vue项目首页加载时间过久】
  14. 正态分布(Normal Distribution)
  15. 股权架构设计五大关键要点
  16. 一文带你了解身份证实名认证类api接口
  17. 服务器信号满格网速很慢,手机信号满格但网速很慢 可能是这5个原因
  18. 办公环境计算机配置参数,联想昭阳e43a配置参数大揭秘
  19. Ubuntu 20.04 物理机安装
  20. 疑难杂症、易混淆、易遗忘的知识点记录

热门文章

  1. 怎么修改地磅服务器的修改记录,地磅无人值守系统软件怎么修改数据
  2. python中修饰器_python 中的修饰器
  3. 暂停 CSS @keyframes 动画
  4. 学习vue3系列reactive
  5. java 新闻编辑_使用 Java 构建你自己的文本编辑器|Linux 中国
  6. php 科学计数 位数,PHP采用超长位数字运算防止数字以科学计数法显示的实例
  7. Part Six 地理定位API
  8. EXCEL 将选中列改为只读
  9. Java中的frontcolor_关于java:Color.red和Color.RED之间的区别
  10. java基线_基线的概念-------权威