java字符串参数传递_java – 为什么传递两个字符串参数比一个列表参数更有效...

下面的代码调用了两个简单的函数,每个函数都是10亿次.

public class PerfTest {

private static long l = 0;

public static void main(String[] args) {

List list = Arrays.asList("a", "b");

long time1 = System.currentTimeMillis();

for (long i = 0; i < 1E10; i++) {

func1("a", "b");

}

long time2 = System.currentTimeMillis();

for (long i = 0; i < 1E10; i++) {

func2(list);

}

System.out.println((time2 - time1) + "/" + (System.currentTimeMillis() - time2));

}

private static void func1(String s1, String s2) { l++; }

private static void func2(List sl) { l++; }

}

我的假设是,这两个电话的表现将接近于相同.如果有什么我会猜到通过两个参数会比通过一个稍慢.由于所有的参数都是对象引用,所以我并不期望有一个是一个列表来做任何改动.

我经历了很多次测试,典型的结果是“12781/30536”.换句话说,使用两个字符串的呼叫需要13秒,使用列表的呼叫需要30秒.

这个性能差异的解释是什么?还是这个不公平的考验?我已经尝试切换两个呼叫(如果是由于启动效果),但结果是一样的.

更新

这不是一个公平的考验,原因很多.但是它确实证明了Java编译器的真实行为.请注意以下两个补充说明:

>将表达式s1.getClass()和sl.getClass()添加到函数中,使两个函数调用相同

>使用-XX运行测试:-TieredCompilation还使得两个函数调用执行相同

这个行为的解释在下面接受的答案. @ apangin的答案的最简单的总结是,func2没有由热点编译器内联,因为它的参数(即List)的类没有被解析.强制解析类(例如使用getClass)会导致内联,这显着提高了其性能.正如答案中指出的那样,未解决的类不太可能发生在实际代码中,这使得该代码成为不切实际的边缘情况.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值