Beetl 性能揭秘 1 :如何输出一个整型变量
为什么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 :如何输出一个整型变量相关推荐
- [JAVA]使用if…else语句编写代码。定义一个整型变量a,为其赋值为20,判断20是奇数还是偶数,如果为奇数,输出“a是奇数”,否则输出“a是偶数”
使用if-else语句编写代码.定义一个整型变量a,为其赋值为20,判断20是奇数还是偶数,如果为奇数,输出"a是奇数",否则输出"a是偶数" public c ...
- 计算机专业显卡,NVIDIA专业计算机显卡QuadrO性能揭秘.doc
NVIDIA专业显卡Quadro性能揭秘Quadro走亲民路线 NV携GeForce双管齐下NVIDIA作为一个走在视觉处理前沿阵地的硬件厂商,其民用级显卡上拥有很高的知名度,也许很多消费者不知道这个 ...
- 用python中函数输出杨辉三角_用Python输出一个杨辉三角的例子
这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...
- python输出杨辉三角啊二维数组_用Python输出一个杨辉三角的例子
这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...
- 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
试题描述 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少? 输入格式 一个整型范围内的整数,即初始时整型变量的值. 输出格式 一个整数,经过上述过程后得到 ...
- ACMNO.34 C语言-格式输出 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用6.2f格式输出。
题目描述 请设计输出实数的格式, 包括: ⑴一行输出一个实数:⑵一行内输出两个实数:⑶一行内输出三个实数. 实数用"6.2f"格式输出. 输入 一个实数,float范围 输出 输出 ...
- c语言:输出一个菱形图
输出一个菱形图. 解:程序: #include<stdio.h> int main() { int i, j; char diamond[][5] = { {' ',' ','*'},{' ...
- MODE —— 输出一个高度和宽度固定的方框(知识点:for循环嵌套for循环)
问题描述: 终端输入,需要的图形的高度和宽度,绘制图形. 运行结果: 代码部分: #include <stdio.h> int main() {unsigned int width = 0 ...
- C语言经典例73-反向输出一个链表
目录 1 题目 2 分析 2.1 方法1-原地逆置 2.2 方法2-递归 3 实现 3.1 实现1-原地逆置 3.2 实现2-递归 4 运行结果 1 题目 反向输出一个链表,链表结构为: typede ...
最新文章
- LeetCode 报错解决 heap-buffer-overflow Heap-use-after-free Stack-buffer-overflow Global-buffer-overflow
- 软件构架实践读书笔记二
- python列表按照指定顺序排序-python列表排序、字典排序、列表中字典排序
- 0.为什么要学习Vue?
- Android 对okhttp的封装
- 使用 “vue-cropper“进行图片裁剪
- linux重启kvm服务命令,linux中kvm的安装及快照管理
- 【PAT天梯】【L2-2 小字辈(左子右兄加强版)】(树,水题)
- java 最优算法_java 问题 求个最优算法
- swift面向对象之属性
- mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.
- 王道 —— 进程同步、进程互斥
- 【Vue-router中,require代替import解决vue项目首页加载时间过久】
- 正态分布(Normal Distribution)
- 股权架构设计五大关键要点
- 一文带你了解身份证实名认证类api接口
- 服务器信号满格网速很慢,手机信号满格但网速很慢 可能是这5个原因
- 办公环境计算机配置参数,联想昭阳e43a配置参数大揭秘
- Ubuntu 20.04 物理机安装
- 疑难杂症、易混淆、易遗忘的知识点记录
热门文章
- 怎么修改地磅服务器的修改记录,地磅无人值守系统软件怎么修改数据
- python中修饰器_python 中的修饰器
- 暂停 CSS @keyframes 动画
- 学习vue3系列reactive
- java 新闻编辑_使用 Java 构建你自己的文本编辑器|Linux 中国
- php 科学计数 位数,PHP采用超长位数字运算防止数字以科学计数法显示的实例
- Part Six 地理定位API
- EXCEL 将选中列改为只读
- Java中的frontcolor_关于java:Color.red和Color.RED之间的区别
- java基线_基线的概念-------权威