2015-09-27 164 views
0

在我的計算機體系結構類中,我剛剛學會了如果所需乘法的次數少於3,運行乘法電路中涉及乘法的代數表達式可能比通過加法電路運行代價表達式的成本更高。例如:3x。如果我正在做這種類型的計算幾十億次,它是否付出代價將其寫爲:x + x + x或者JIT優化器是否爲此優化?JIT優化器是否優化乘法?

回答

2

我不希望在寫這種方式或其他方面有很大的不同。

編譯器可能會照顧使所有這些等效。

你可以嘗試每種方法並測量需要多長時間,這可以給你一個很好的暗示來回答你自己的問題。

下面是一些使用不同方法(x + x + x,3 * x和位移後接減法)進行1000萬次相同計算的代碼。

他們似乎都需要大約相同的時間量由System.nanoTime測量。

樣品輸出一個運行:

sum : 594599531 
mult : 568783654 
shift : 564081012 

您也可以看看這個問題,談到有關編譯器的優化如何可能處理這些更復雜的情況:Is shifting bits faster than multiplying and dividing in Java? .NET?

代碼:

import java.util.Random; 

    public class TestOptimization { 

     public static void main(String args[]) { 
      Random rn = new Random(); 
      long l1 = 0, l2 = 0, l3 = 0; 
      long nano1 = System.nanoTime(); 
      for (int i = 1; i < 10000000; i++) { 
       int num = rn.nextInt(100); 
       l1 += sum(num); 
      } 
      long nano2 = System.nanoTime(); 
      for (int i = 1; i < 10000000; i++) { 
       int num = rn.nextInt(100); 
       l2 += mult(num); 
      } 
      long nano3 = System.nanoTime(); 
      for (int i = 1; i < 10000000; i++) { 
       int num = rn.nextInt(100); 
       l3 += shift(num); 
      } 
      long nano4 = System.nanoTime(); 
      System.out.println(l1); 
      System.out.println(l2); 
      System.out.println(l3); 
      System.out.println("sum : " + (nano2 - nano1)); 
      System.out.println("mult : " + (nano3 - nano2)); 
      System.out.println("shift : " + (nano4 - nano3)); 
     } 

     private static long sum(long x) { 
      return x + x + x; 
     } 

     private static long mult(long x) { 
      return 3 * x; 
     } 

     private static long shift(long x) { 
      return (x << 2) - x; 
     } 

    }