Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 最有效的方法是什么? float值=0; for(Foo-Foo:arrayList){ 浮动时间值=计算(foo); if(时间值值){ 价值=时间价值; }_Java - Fatal编程技术网

Java 最有效的方法是什么? float值=0; for(Foo-Foo:arrayList){ 浮动时间值=计算(foo); if(时间值值){ 价值=时间价值; }

Java 最有效的方法是什么? float值=0; for(Foo-Foo:arrayList){ 浮动时间值=计算(foo); if(时间值值){ 价值=时间价值; },java,Java,是否可以在Java8中进行性能优化? 例如,使用不同的迭代方法或其他方法。删除多余的步骤: if(临时值>值){ 价值=时间价值; } 或者当您有一个值>=minValue时,简单地从循环中断开 或者使用Java 8流: final float value=(float)数组列表 .stream() .mapToDouble(此::计算) .max(); 与基本循环相比,这不太可能提高性能,事实上它可能更慢。然而,流可以很容易地并行化(或者至少比自定义多线程要容易得多) 但是您需要问的第一个

是否可以在Java8中进行性能优化?
例如,使用不同的迭代方法或其他方法。

删除多余的步骤:

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)