2016-08-15 70 views
0

对于下面的代码通过?换句话说:是不是这上面的慢:参数在多个听众

public void execute(Object[] arguments) 
{ 
    long id = ((Double) arguments[0]).longValue() 
    for(MyListener listener : listOfListeners) 
    { 
    listener.apply(id); 
    } 
} 

回答

2

是的,这种优化被称为loop invariant hoisting,以及热点JVM肯定can do this

我们可以通过一个简单的JMH基准来验证这一点。

package bench; 

import org.openjdk.jmh.annotations.*; 

import java.util.List; 
import java.util.stream.Collectors; 
import java.util.stream.IntStream; 

@State(Scope.Benchmark) 
public class Listeners { 
    List<Listener> listOfListeners = IntStream.range(0, 50) 
      .mapToObj(Listener::new) 
      .collect(Collectors.toList()); 

    Object[] arguments = {Math.random()}; 

    @Benchmark 
    public void inside() { 
     for (Listener listener : listOfListeners) { 
      listener.apply(((Double) arguments[0]).longValue()); 
     } 
    } 

    @Benchmark 
    public void outside() { 
     long id = ((Double) arguments[0]).longValue(); 
     for (Listener listener : listOfListeners) { 
      listener.apply(id); 
     } 
    } 

    static class Listener { 
     private long sum; 

     Listener(int initialValue) { 
      this.sum = initialValue; 
     } 

     public void apply(long id) { 
      sum += id; 
     } 
    } 
} 

结果表明,无论是insideoutside方法是在性能方面的平等。

Benchmark   Mode Cnt Score Error Units 
Listeners.inside avgt 10 53,354 ± 0,317 ns/op 
Listeners.outside avgt 10 53,690 ± 0,373 ns/op 
+0

感谢您的帮助:) – Kode

-1

我不认为在JVM做这种优化的,所以我建议你执行一次操作(如你的第二个例子)。