java中将整数化为字符串_在java中将整数转换为字符串的最快方法

每次我必须将一个intin转换为一个字符串时,我选择了“”aor Integer.toString(a).现在我想知道哪种方式更快,所以我编写了一个简单的基准测试,调用function_1,function_2和function_3 10000000次并打印处理函数所需的时间.以下是功能:

public static String i="";

public static String j="";

public static String k="";

public static void function_1()

{

i=Integer.toString(getOne());

}

public static void function_2()

{

j=""+1;

}

public static void function_3()

{

j=""+getOne();

}

public static int getOne()

{

return 1;

}

输出是:

Benchmarking starting...

Executing function_1 10000000 time(s)...

Done executing function_1 in 476 ms.

Executing function_2 10000000 time(s)...

Done executing function_2 in 8 ms.

Executing function_3 10000000 time(s)...

Done executing function_3 in 634 ms.

Benchmarking complete!

我认为function_2是如此之快,因为它被编译为

public static void function_2()

{

j="1";

}

所以为了避免这种情况,我使用了函数getOne()代替.但这里是有趣的部分(对我来说):函数_3必须在不使用Object的原始toString方法的情况下进行编译(在本例中为Integer.toString(1),因为int是原始的).我的问题是:编译器如何实际威胁“”1,所以它比调用Integer.toString(1)慢?

解决方法:

“”和“1”在编译时是已知的.这就是为什么在转换为字节码时,function_2“”1真的被“1”取代.

getOne()结果在编译时是未知的,因此连接将在运行时完成.但是因为concatenation()效率不高,编译器可能会将此更改为基于StringBuilder.append()的实现.

不相信我?尝试:javap -c ClassName.class,你会看到这样的东西:

public static void function_2();

Code:

0: ldc #39 // String 1

2: putstatic #16 // Field j:Ljava/lang/String;

5: return

public static void function_3();

Code:

0: new #42 // class java/lang/StringBuilder

3: dup

4: invokespecial #44 // Method java/lang/StringBuilder."":()V

7: invokestatic #28 // Method getOne:()I

10: invokevirtual #45 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;

13: invokevirtual #49 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

16: putstatic #16 // Field j:Ljava/lang/String;

19: return

function_2()只有一个字符串“1”,而function_3有所有这些方法调用,里面有额外的StringBuilder

标签:java,optimization,benchmarking,performance

来源: https://codeday.me/bug/20190520/1142957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值