Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java性能前端:for循环中的ref_Java_Performance_Jakarta Ee - Fatal编程技术网

java性能前端: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

哪种代码更适合您的性能点?我认为第二个代码是因为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);
}
//第一个代码
对于(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()的多个调用就是这样做的。@汤姆·霍丁:我怀疑额外的代码行和外部作用域中的额外变量是否会更好。我认为只有分析不同的版本才会显示出好处,如果有的话。