java性能前端:for循环中的ref
哪种代码更适合您的性能点?我认为第二个代码是因为for循环中的ref创建不好 我可以知道你的意见吗java性能前端:for循环中的ref,java,performance,jakarta-ee,Java,Performance,Jakarta Ee,哪种代码更适合您的性能点?我认为第二个代码是因为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
// 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);
}
//第一个代码
对于(int i=0;i
我认为两者的性能差别不大。唯一的主要区别是SipSession
参考的范围。但是如果你这么在意的话,你应该试着分析一下。我认为两者之间没有太大的性能差异。唯一的主要区别是SipSession
参考的范围。但是如果你这么在意的话,你应该试着分析一下。在你的第一段代码中,虚拟机甚至编译器都会删除引用变量,因为它从来没有在它的作用域内使用过
它将被优化为
for(int i=0;i<array.size();i++){
array1.get(i);
}
这将只调用一次
array.size()
,而不是在每次循环迭代中调用。在第一个代码中,VM甚至编译器都将删除引用变量,因为它从未在其范围内使用过
它将被优化为
for(int i=0;i<array.size();i++){
array1.get(i);
}
这将只调用一次
array.size()
,而不是在每次循环迭代中调用。最终它不会有什么区别。JIT会将代码优化到完全相同的程度
当然,唯一的区别是范围。最终它不会有什么区别。JIT会将代码优化到完全相同的程度
当然,唯一的区别是范围。只有在分析了代码并确定这是瓶颈之后,才能根据性能进行选择 在此之前,请选择您认为更清晰、更易于维护的版本
我总是会选择第一个版本,除非我需要最后一个
SipSession
引用来延长循环的寿命。只有在分析了代码并确定这是瓶颈之后,才能从性能角度进行选择
在此之前,请选择您认为更清晰、更易于维护的版本
我总是会选择第一个版本,除非我需要最后一个
SipSession
引用来延长循环的寿命。这将是微优化,最好是对代码进行其他类型的优化,而不是在没有证明这是瓶颈的情况下进行优化。这里的情况并非如此。这将是微观优化,最好是对代码进行其他类型的优化,而不是在没有证据证明这是瓶颈的情况下进行优化。这里的情况并非如此。不要在没有分析的情况下尝试优化。JIT编译器完成了繁重的工作,因此您不必这样做
除此之外,您的数组
似乎是一个原始的列表
,而不是一个通用的列表
。泛型不一定会优化代码,但它使代码更易于理解和维护。您的简单循环可以重写为:
List<SipSession> array;
for(SipSession abc : array){
// Stuff
}
列表数组;
用于(SipSession abc:array){
//东西
}
不要在没有分析的情况下尝试优化。JIT编译器完成了繁重的工作,因此您不必这样做
除此之外,您的数组
似乎是一个原始的列表
,而不是一个通用的列表
。泛型不一定会优化代码,但它使代码更易于理解和维护。您的简单循环可以重写为:
List<SipSession> array;
for(SipSession abc : array){
// Stuff
}
列表数组;
用于(SipSession abc:array){
//东西
}
我不认为有什么区别值得忽略,我更喜欢第一个,因为它的可读性,不过如果这对你来说很重要,你应该分析一下。更可能的优化来自于不强制转换、删除对大小的重复调用(虽然很可能是内联的)和转换列表(大概是这样)在这个循环之前,我不认为有什么区别值得忽略,我更喜欢第一个,因为它的可读性,尽管如果这对你来说很重要,你应该分析一下。更可能的优化来自于不强制转换,删除重复调用大小(虽然很可能是内联的)和转换列表(大概是这样)在这个循环之前进入一个实际的数组。如果你那么在意的话,你应该尝试分析。通过分析,我将在这段代码中找到什么。for循环所花费的时间?如果您这么在意的话,应该尝试分析。通过分析,我将在这段代码中发现什么。for循环占用的时间?您可能会遇到反向循环未优化的问题。(我能记得的最后一个信息是,硬件对此进行了很好的优化,但HotSpot没有。)@Tom Hawtin:优化不是反向循环。优化是避免所有的方法调用array.size()
。主要的变化是循环向后运行。如果要删除对size()
,final int size=array.size()的多个调用“代码>就是这样做的。@汤姆·霍丁:我怀疑额外的代码行和外部作用域中的额外变量是否会更好。我认为只有分析不同的版本才会显示出好处,如果存在的话。你可能会遇到反向循环没有得到优化的问题。(我能记得的最后一个信息是,硬件对此进行了很好的优化,但HotSpot没有。)@Tom Hawtin:优化不是反向循环。优化是避免所有的方法调用array.size()
。主要的变化是循环向后运行。如果要删除对size()
,final int size=array.size()的多个调用“代码>就是这样做的。@汤姆·霍丁:我怀疑额外的代码行和外部作用域中的额外变量是否会更好。我认为只有分析不同的版本才会显示出好处,如果有的话。