2016-08-15 75 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做這種優化的,所以我建議你執行一次操作(如你的第二個例子)。