Java 最有效的方法是什么? float值=0; for(Foo-Foo:arrayList){ 浮动时间值=计算(foo); if(时间值值){ 价值=时间价值; }
是否可以在Java8中进行性能优化?Java 最有效的方法是什么? float值=0; for(Foo-Foo:arrayList){ 浮动时间值=计算(foo); if(时间值值){ 价值=时间价值; },java,Java,是否可以在Java8中进行性能优化? 例如,使用不同的迭代方法或其他方法。删除多余的步骤: if(临时值>值){ 价值=时间价值; } 或者当您有一个值>=minValue时,简单地从循环中断开 或者使用Java 8流: final float value=(float)数组列表 .stream() .mapToDouble(此::计算) .max(); 与基本循环相比,这不太可能提高性能,事实上它可能更慢。然而,流可以很容易地并行化(或者至少比自定义多线程要容易得多) 但是您需要问的第一个
例如,使用不同的迭代方法或其他方法。删除多余的步骤:
if(临时值>值){
价值=时间价值;
}
或者当您有一个值>=minValue
时,简单地从循环中断开
或者使用Java 8流:
final float value=(float)数组列表
.stream()
.mapToDouble(此::计算)
.max();
与基本循环相比,这不太可能提高性能,事实上它可能更慢。然而,流可以很容易地并行化(或者至少比自定义多线程要容易得多)
但是您需要问的第一个问题是,我是否需要优化此代码?你的名单有多大?这段代码多久被调用一次?与迭代相比,calculate()
方法有多复杂?删除多余的步骤:
if(临时值>值){
价值=时间价值;
}
或者当您有一个值>=minValue
时,简单地从循环中断开
或者使用Java 8流:
final float value=(float)数组列表
.stream()
.mapToDouble(此::计算)
.max();
与基本循环相比,这不太可能提高性能,事实上它可能更慢。然而,流可以很容易地并行化(或者至少比自定义多线程要容易得多)
但是您需要问的第一个问题是,我是否需要优化此代码?你的名单有多大?这段代码多久被调用一次?与迭代相比,calculate()
方法有多复杂?由于列表中满足条件“wins”的最后一个值,您可以向后迭代,并在第一个值大于或等于最小值时立即跳出循环。假设计算方法没有重要的副作用。由于列表中满足条件“wins”的最后一个值,您可以向后迭代,并在第一个值大于或等于min值时立即中断循环。假设计算方法没有重要的副作用。首先,简化顺序代码:
float value = 0;
for (Foo foo : arrayList) {
float temporaryValue = calculate(foo);
if (temporaryValue < minValue) {
continue;
}
value = temporaryValue;
}
然后,如果ArrayList上的元素数量足够多,您可以尝试并行化代码。首先,使您的方法可并行化:
float value = 0;
for (Foo foo : arrayList) {
float temporaryValue = calculate(foo);
if (temporaryValue > minValue) {
value = temporaryValue;
}
}
您可能希望进一步优化每个线程迭代的分布:
for(int i=threadID;i
根据calculate
方法的内容,使用动态循环分布可能会有所回报。首先,简化顺序代码:
float value = 0;
for (Foo foo : arrayList) {
float temporaryValue = calculate(foo);
if (temporaryValue < minValue) {
continue;
}
value = temporaryValue;
}
然后,如果ArrayList上的元素数量足够多,您可以尝试并行化代码。首先,使您的方法可并行化:
float value = 0;
for (Foo foo : arrayList) {
float temporaryValue = calculate(foo);
if (temporaryValue > minValue) {
value = temporaryValue;
}
}
您可能希望进一步优化每个线程迭代的分布:
for(int i=threadID;i
根据calculate
方法的内容,使用动态循环分布可能会有回报。将简单的for循环转换为流并不能提高性能。如果我相信我所听到的,它会带来轻微的开销。并行化可能会有所帮助。计算方法相当大,大约有80行。@Aaron很好,我会相应地修改。在这种情况下,计算方法可能是进行优化的更好地方。虽然Streams API可以简化代码并使其更具可读性,但如果您看到这样做有任何性能提升,我会感到惊讶。根据列表中的项目数,多线程可能会有所帮助,但它会带来开销,这实际上可能会增加小列表的处理时间。我的答案是打破循环将简单的for循环转换为流,这并不能提高性能。如果我相信我所听到的,它会带来轻微的开销。并行化可能会有所帮助。计算方法相当大,大约有80行。@Aaron很好,我会相应地修改。在这种情况下,计算方法可能是进行优化的更好地方。虽然Streams API可以简化代码并使其更具可读性,但如果您看到这样做有任何性能提升,我会感到惊讶。根据列表中项目的数量,多线程可能会有所帮助,但它会带来开销,这实际上会增加小列表的处理时间
float max_value = Integer.MIN_VALUE;
for (float v : values) {
max_value = Math.max(v, max_value);
}
for (int i = threadID; i < arrayList.size(); i+= total_threads)