整型转字符串(convert int to char)优化实践
0. 前言
其实基本都没什么机会做这么一个基础的优化,一般基础库里就有函数可以直接拿来用。
这里以snprintf为基准,给大家展示一下每一个优化带来的些许收益。
1. 优化过程
1.最初使用的是snprintf
2.除10和模10, buf就地reverse
由于每次模10之后产生的都是个位数,所以buf中的字符是逆序的,需要在最后对字符数组做一次reverse。
3.将除10改成乘法加移位
这时除10对应的操作是x * 0x66666667 >> 34;
在小于0x27ffffff0时使用乘法加移位,大于0x27ffffffb时直接除10,目的是避免溢出。
4.在上面的基础上优化成除100,加一个查表
表里存放00到99的字符,在余数小于100时就查表获得对应的字符,这里将步长加大为两倍可以减少一半的循环。
5.将除100优化成两次除10(乘法加移位)
优化之后除100这个操作变得更快。
6.计算出整数换算成10进制时的长度,规避后面的reverse操作。
计算出长度的函数使用了类似二分查找的方式,快速确定位数,会增加一定的开销。字符串较短的情况下,可能反而性能会更差一些;在字符串长度较长时,考虑到就地reverse可能也会消耗较多的时间,这里可能会获得一些收益。
7.用一次除法将大于12位的整数拆分成高位和低位两个数。
大于0x27ffffff0的数字要除100。
通过一次除法拆分成两个小于0x27ffffff0的数减少做除法的次数。
执行100000000次的CPU时间对比
在服务器上跑出来的结果

整型转字符串(convert int to char)优化实践的更多相关文章
- 整型转字符串(convert int to char)优化实践——一个意外的BUG
convert_int_to_char函数在使用时出现过一个BUG. 当使用值是13200020099时,返回的字符串是"13200020111",结果是错误的. 在gcc编译器里 ...
- (转)JAVA的整型与字符串相互转换
JAVA的整型与字符串相互转换1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 ...
- stringsteam使用之整型转字符串
最近需要用到整型转字符串的操作,学习了stringstream一些皮毛. 首先需要包含头文件. #include<sstream> 然后用流操作的方式将值传递给stringstream对象 ...
- Java:集合,对列表(List)中的数据(整型、字符串、日期等)进行排序(正序、倒序)的方法;字符串按照整型排序的方法
1. 要求 对List列表中的数据进行排序(正序.倒序),列表中的数据包括:整型(Integer).字符串(String).日期(Date)等.对于字符串,要求允许对它按照整型进行排序. 2. 实现思 ...
- python学习3—数据类型之整型、字符串和布尔值
python学习3-数据类型之整型.字符串和布尔值 数据类型 python3支持的数据类型共有6种: 1 Number 2 String 3 List 4 Tuple 5 Set 6 Dictiona ...
- jinja 语法 - 整型转字符串
大多数 jinja 相关的问题,其实查文档就解决了,但后来遇到这个问题,使得我把 jinja 官方文档,api.样例等,认真读了个遍= =. 发现没有直接的办法可以将整型转为字符串,对于需要进行字符串 ...
- python --- 03 整型 bool 字符串 for循环
一.整型(int) 基本操作: 1.+ - * / % // ** 2. .bit_length() 计算整数在内存中占⽤的⼆进制码的⻓度 如: 二.布尔值(bool) True False 1. ...
- python之路---03 整型 bool 字符串 for循环
十三.整型(int) 基本操作: 1.+ - * / % // ** 2. .bit_length() 计算整数在内存中占⽤的⼆进制码的⻓度 如: 十四.布尔值(bool) True False ...
- Python数据类型(整型,字符串类型,列表)
一:数据的概念 1.数据是什么 x=10,数据10就是我们要存储的数据. 2.为什么数据要分不同的种类? 因为数据是用来表示状态的,不同的状态就要用不同类型的数据去表示. 3:Python中常见的数据 ...
随机推荐
- 【Xilinx-Petalinux学习】-07-OpenCV的软硬件处理速度对比
有空了设计一个hls的图像处理IP. 通过hls设计ip模块实现opencv的图像处理. 对比软件和硬件的图像处理速度.
- Struts2动态方法调用
动态方法就是一个Action对应多个请求,减少Action的数量 1.指定method属性 <action name="addAction" method="add ...
- Sed替换 内容带反斜杠(/)
sed "s#XXXX#${NAME}#" $MAIL_CONTENT > /tmp/MAIL_CONTENT1.tmp -----不论什么字符,紧跟着s命令的都被认为是新的 ...
- input 框上传多个文件
在input标签中加入 multiple 属性,可以在一个输入框中选择多个文件进行上传 <input type="file" name="img" mul ...
- java环境设置与运行
在初学java编程语言时,痛苦的事莫过于跟着示例一步步做,总是得不到想要的结果,这是很多初学者都会碰到的问题.下面详细教你运行第一个java应用程序(环境windows xp + jdk 6.0): ...
- HTML 多媒体、Object 元素、音频、视频
Web 上的多媒体指的是音效.音乐.视频和动画. 现代网络浏览器已支持很多多媒体格式. 什么是多媒体? 多媒体来自多种不同的格式.它可以是您听到或看到的任何内容,文字.图片.音乐.音效.录音.电影.动 ...
- Java Swing jpanel paint方法执行两次的问题
Java Swing jpanel paint方法执行两次的问题: 在其他环境下执行了两次,自己测试怎么都是执行了一次,记录一下这个问题:需要后继工作: 可能是进行各种参数设置的时候导致了paint方 ...
- Tomcat 使用过程中的一些技巧
url中文地址乱码 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDe ...
- C++中的trivial解释
Trivial default constructor The default constructor for class T is trivial (i.e. performs no action) ...
- Excel里函数中的万金油,你确定不要点进来看看?
Excel里函数中的万金油,你确定不要点进来看看? 来源:EXCELHome Excel里有个号称"万能"的函数组合,这个函数组合就是INDEX+SMALL+IF,很多应用场合都能 ...