最近研究netty源码,有一段代码,引起我对Integer.toString性能的关注:
先上netty源码片段:
private static final String[] INTEGERS = {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12", "13", "14", "15",
};
public static String toString(int value) {
if (value >= 0 && value < INTEGERS.length) {
return INTEGERS[value];
} else {
return Integer.toString(value);
}
}
这个toString方法是netty将handler对象放到Map中,在获取Map的key时调用的。作者定义了16个下标,超过16则调用Integer.toString方法获取下标。
这就有一个问题了,Integer.toString到底比直接去取定义在数组的字符串慢多少呢,看下面的测试代码:
final String[] str = { new String("1"), new String("2"), new String("3"), new String("4"), new String("5"),
new String("6"), new String("7"), new String("8"), new String("9"), new String("10"), new String("11") };
Date start = new Date();
long startTime = start.getTime();
for (int i = 0; i < 1000000; i++) {
for (int j = 0; j < 11; j++) {
String test = str[j];
}
}
Date end = new Date();
long endTime = end.getTime();
System.out.println("数组所需时间:" + (endTime - startTime));
Date start1 = new Date();
long startTime1 = start1.getTime();
for (int i = 0; i < 1000000; i++) {
for (int j = 0; j < 11; j++) {
String test = Integer.toString(j);
}
}
Date end1 = new Date();
long endTime1 = end1.getTime();
System.out.println("ToString所需时间:" + (endTime1 - startTime1));
数组所需时间:16ms
ToString所需时间:328ms
测试结果很明显了,到数组里面取比调用Integer.toString方法要快很多。
为啥快呢?
个人认为:1,由于拆箱装箱的原理,获取字符串的内存区域不同。
2,可以看看Integer.toString源码:
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(0, size, buf);
}
当然,在很多系统,这么点时间根本就算不了什么。但是如果碰到netty这种使用场景,可以做一些优化。哈哈.
可能有没有想到的地方,希望大家补充。
分享到:
相关推荐
System.DateTime.Now.ToString()的各种用法例如//2007-4-24 this.TextBox7.Text = System.DateTime.Now.ToString("d");等...
map.toString()后转换成Map类型
得到计算机操作系统版本信息,VB.NET源代码编写Environment.OSVersion.ToString
console.log(Object.prototype.toString.call(arr)) //[object Array] 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下: 15.2.4.2 ...
问题的描述是这样的: 代码如下: console.log(10..toString());//10 console.log(10.toString());//SyntaxError: Unexpected token ILLEGAL 为什么前者正常,而后者报错呢。原因就是,在JavaScript中,数字后面的”....
生成GUID程序,C#源代码,System.Guid.NewGuid().ToString()全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。 GUID...
浅谈ToString()和Convert.ToString()方法的区别 一、一般用法说明 ToString()是Object的扩展方法,所以都有ToString()方法;而Convert.ToString(param)(其中param参数的数据类型可以是各种基本数据类型,也可以是...
Serilog.Exceptions是Serilog的附加用于记录Exception.ToString()中未输出的异常详细信息和自定义属性。它有什么作用? 现在,您的JSON日志将补充详细的异常信息,甚至是自定义异常属性。 这是当您从EntityFramework...
为什么要用Object.prototype.toString而不是Function.prototype.toString或者其它?这是和他们的toString解释方式有关系的。下面是ECMA中对Object.prototype.toString的解释: 代码如下: Object.prototype.toString...
C#中,string 是 System.String 的别名,所以基本上在使用时是没有差别的。
本文实例分析了C#中Convert.ToString和ToString的区别,对于初学者来说是很有必要加以熟练掌握的。具体分析如下: 1.Convert.ToString能处理字符串为null的情况。 测试代码如下: static void Main(string[] args) ...
一、利用Integer将十进制的数进行进制转换 方法 十进制转换其他进制 使用方法 ...Integer.toString(100, 16) 一个R进制字符串 例子 public class Main { public static void main(String[] args)
console.log(Object.prototype.toString.call(obj) === "[object Object]"); 使用以上方式可以很好的区分各种类型: (无法区分自定义对象类型,自定义类型可以采用instanceof区分) console.log(Object.prototype....
int daySpan = Integer.parseInt(obj[7].toString()) - Integer.parseInt(obj[6].toString()); if(aMin ){ aMin += 60; aHour -= 1; } boolean flag = false; if(aHour ){ ...
主要介绍了node.js中的buffer.toString方法使用说明,本文介绍了buffer.toString的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
我想大家对DateTime.ToString()方法的用法肯定已经非常熟悉了,但我想大家用过的大部分用法都是:DateTime.ToString(“format”),不过本文想讲述的是它的另一个重载方法DateTime.ToString(“format”,...
一个友好的.改善的 Object.prototype.toString的实现