2015-09-27 124 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; 
     } 

    }