最近在项目重构时遇到一个问题,大致是要将界面传回到后台的String类型的格式为yyyy-dd-mm HH:MM:ss的时间字符串转化成时间戳,然后再将时间戳转化成long类型,然后进行其他处理。在转化成long类型的时候,个人使用的Long.valueOf()方式处理的,但是在代码扫描的时候,提示我应当使用更为高效的Long.parseLong()来处理。改了之后就通过了扫描。个人在下班后作了一个比对,情况如下:
测试代码:
public class MyTest {
public static void main(String[] args) {
String str1 = "1593351482466";
/**
* 一次转化比对
*/
// parseLong计时
System.out.println("一次转换情况如下:");
long sTime = System.currentTimeMillis();
for (int i = 0; i < 1; i++) {
long l2 = Long.parseLong(str1);
}
long eTime = System.currentTimeMillis();
System.out.println("parseLong开始:"+(sTime));
System.out.println("parseLong结束:"+(eTime));
System.out.println("parseLong耗时"+(eTime - sTime));
// valueOf计时
long sTime1 = System.currentTimeMillis();
for (int i = 0; i < 1; i++) {
long l3 = Long.valueOf(str1);
}
long eTime1 = System.currentTimeMillis();
System.out.println("valueOf开始:"+(sTime1));
System.out.println("valueOf结束:"+(eTime1));
System.out.println("valueOf耗时"+(eTime1 - sTime1));
/**
* 五次转化比对
*/
// parseLong计时
System.out.println("五次转换情况如下:");
long sTime2 = System.currentTimeMillis();
for (int i = 0; i < 5; i++) {
long l4 = Long.parseLong(str1);
}
long eTime2 = System.currentTimeMillis();
System.out.println("parseLong开始:"+(sTime2));
System.out.println("parseLong结束:"+(eTime2));
System.out.println("parseLong耗时"+(eTime2 - sTime2));
// valueOf计时
long sTime3 = System.currentTimeMillis();
for (int i = 0; i < 5; i++) {
long l5 = Long.valueOf(str1);
}
long eTime3 = System.currentTimeMillis();
System.out.println("valueOf开始:"+(sTime3));
System.out.println("valueOf结束:"+(eTime3));
System.out.println("valueOf耗时"+(eTime3 - sTime3));
/**
* 五百次次转化比对
*/
// parseLong计时
System.out.println("五百次转换情况如下:");
long sTime4 = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
long l4 = Long.parseLong(str1);
}
long eTime4 = System.currentTimeMillis();
System.out.println("parseLong开始:"+(sTime4));
System.out.println("parseLong结束:"+(eTime4));
System.out.println("parseLong耗时"+(eTime4 - sTime4));
// valueOf计时
long sTime5 = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
long l5 = Long.valueOf(str1);
}
long eTime5 = System.currentTimeMillis();
System.out.println("valueOf开始:"+(sTime5));
System.out.println("valueOf结束:"+(eTime5));
System.out.println("valueOf耗时"+(eTime5 - sTime5));
/**
* 五千次转化比对
*/
// parseLong计时
System.out.println("五千次转换情况如下:");
long sTime6 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
long l4 = Long.parseLong(str1);
}
long eTime6 = System.currentTimeMillis();
System.out.println("parseLong开始:"+(sTime6));
System.out.println("parseLong结束:"+(eTime6));
System.out.println("parseLong耗时"+(eTime6 - sTime6));
// valueOf计时
long sTime7 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
long l5 = Long.valueOf(str1);
}
long eTime7 = System.currentTimeMillis();
System.out.println("valueOf开始:"+(sTime7));
System.out.println("valueOf结束:"+(eTime7));
System.out.println("valueOf耗时"+(eTime7 - sTime7));
}
}
测试结果(多次执行后,发现结果并不是唯一确定的,但是发现多次执行结果中有一个共性,举其中一次执行执行结果分析):
一次转换情况如下:
parseLong开始:1593352178846
parseLong结束:1593352178846
parseLong耗时0
valueOf开始:1593352178871
valueOf结束:1593352178871
valueOf耗时0
五次转换情况如下:
parseLong开始:1593352178874
parseLong结束:1593352178874
parseLong耗时0
valueOf开始:1593352178876
valueOf结束:1593352178876
valueOf耗时0
五百次转换情况如下:
parseLong开始:1593352178878
parseLong结束:1593352178880
parseLong耗时2
valueOf开始:1593352178882
valueOf结束:1593352178883
valueOf耗时1
五千次转换情况如下:
parseLong开始:1593352178885
parseLong结束:1593352178890
parseLong耗时5
valueOf开始:1593352178892
valueOf结束:1593352178896
valueOf耗时4
Process finished with exit code 0
结果发现:
(1)当转化次数不是很多的情况下,parseLong和valueOf的耗时一样,比如1次和5次转化耗时均为0。
(2)当次数达到一定多的情况下,parseLong的转化效率要低于valueOf,比如500次和5000的时候,parseLong转化耗时分别为2和5,valueOf的转化耗时分别为1和4。
从上可知得出的结论并不是代码扫描时的结论,难道是个人的测试有问题?各位大佬有没有更好的测试方式。