0

哪个代码更适合您的性能点?我认为第二个代码是因为在 for 循环中创建 ref 并不好。

我可以知道你的意见吗?

// First Code
for (int i = 0; i < array.size(); i++) {
    SipSession abc = (SipSession) array1.get(i);
}

// Second Code
SipSession abc = null;
for (int i = 0; i < array.size(); i++) {
    abc = (SipSession) array1.get(i);
}
4

6 回答 6

3

在分析代码并确定这是瓶颈之后,您应该只根据性能进行选择。

在您完成此操作之前,请选择您认为更清晰、更易于维护的版本。

我总是选择第一个版本,除非我需要最后一个SipSession引用来超过循环。

于 2013-01-19T14:12:25.793 回答
1

最终它不会有任何区别。JIT 会将代码优化为完全相同的东西。

当然,唯一的区别是范围。

于 2013-01-19T14:12:20.730 回答
0

这将是微优化,最好对代码进行其他类型的优化,而不是在没有证明它是瓶颈的情况下进行优化。这不是这里的情况。

于 2013-01-19T14:14:35.040 回答
0

永远不要在没有分析的情况下尝试优化。JIT 编译器完成了繁重的工作,因此您不必.

除此之外,您array似乎是 rawList而不是 generic List<SipSession>。泛型不一定会优化您的代码,但它可以更容易理解和维护。您的简单循环可以重写为:

List<SipSession> array;
for(SipSession abc : array){
    // Stuff    
}
于 2013-01-19T14:17:09.447 回答
0

我认为两者之间没有太大的性能差异。唯一的主要区别是SipSession参考的范围。但是,如果您非常在意则应该尝试进行分析。

于 2013-01-19T14:08:43.903 回答
0

在您的第一个代码中,VM 甚至编译器将简单地删除引用变量,因为它从未在其范围内使用。

它将被优化为

for(int i=0;i<array.size();i++){
    array1.get(i);    
}

根据在方法中所做的事情,get可以在优化时移除空洞循环。

如果访问元素的顺序不重要,您还可以:

for (int i = array.size()-1; 0 <= i ;) {
    SipSession abc = (SipSession) array1.get(i--);
}

这只会调用array.size()一次,而不是在每个循环迭代中调用。

于 2013-01-19T14:12:16.620 回答