Java 乘法怎么比加法快

Java 乘法怎么比加法快,java,optimization,cpu,Java,Optimization,Cpu,我想知道乘法比加法快多少。我写了一个简单的代码,将2个数字相乘,计算所用的时间。然后我将这两个数字相加,找出所花费的时间。结果有点令人不安。在显示结果之前,下面是代码 package com.np.fun; import java.util.Scanner; import org.apache.commons.lang3.time.StopWatch; public class HowSlowIsMultiplication { public static void main(Strin

我想知道乘法比加法快多少。我写了一个简单的代码,将2个数字相乘,计算所用的时间。然后我将这两个数字相加,找出所花费的时间。结果有点令人不安。在显示结果之前,下面是代码

package com.np.fun;

import java.util.Scanner;

import org.apache.commons.lang3.time.StopWatch;

public class HowSlowIsMultiplication {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int x = scanner.nextInt();
    int y = scanner.nextInt();
    long z;
    StopWatch stopWatchMultipy = new StopWatch();
    stopWatchMultipy.start();
    z = x*y;
    stopWatchMultipy.stop();
    System.out.println("Time taken for multiplication is : " + stopWatchMultipy.getNanoTime());
    StopWatch stopWatchAdd_1 = new StopWatch();
    stopWatchAdd_1.start();
    for(int i =0 ;i <Math.min(x, y); i++){
        z = z + Math.max(x, y);
    }
    stopWatchAdd_1.stop();
    System.out.println("Time taken for adding in less for loops is : " + stopWatchAdd_1.getNanoTime());
    StopWatch stopWatchAdd_2 = new StopWatch();
    stopWatchAdd_2.start();
    for(int i =0 ;i <Math.max(x, y); i++){
        z = z + Math.min(x, y);
    }
    stopWatchAdd_2.stop();
    System.out.println("Time taken for adding in more for loops is : " + stopWatchAdd_1.getNanoTime());
}
package com.np.fun;
导入java.util.Scanner;
导入org.apache.commons.lang3.time.StopWatch;
公共类的乘法运算{
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
int x=scanner.nextInt();
int y=scanner.nextInt();
长z;
秒表秒表Multipy=新秒表();
stopWatchMultipy.start();
z=x*y;
stopWatch multipy.stop();
System.out.println(“乘法所用的时间是:“+stopWatchMultipy.getNanoTime());
秒表秒表Add_1=新秒表();
秒表添加_1.start();

对于(int i=0;i首先,不清楚您要测量什么,因为您似乎在比较循环中的一次乘法和多次加法。您不应该惊讶于后者的速度较慢

这就是说,像这样的微基准点本质上是随机噪声。乘法只是机器代码级别上的一条指令。它可能会被任何类型的分支或函数调用所淹没,以测量计时。为了在该级别上获得准确的测量,您必须使用特殊的汇编指令。您还可以由于现代CPU同时执行多条指令,特别是在整数乘法等简单情况下,因此必须考虑无序执行和流水线


再加上JVM和Java的所有抽象,企业就更没有希望了。Java编译成字节码,字节码又由JVM解释或JIT编译。JVM有很大的自由度去做它认为合适的任何优化,所以即使是采用不同字节码指令量的操作也可能没有什么优势或者与最终性能无关。

考虑到我们讨论的每一项都不到2毫秒,可能有许多与代码无关的原因。您确定您的代码和分析是正确的吗?我的意思是,您正在循环中添加,并看到整个循环中的添加时间和仅一个运算符所需的乘法时间用计算器计算:你真的期望做5000(或更多)吗加法比一次乘法快,而且还要考虑额外的5000次计算<代码> max ,<代码> min <代码>,对计数器进行比较和比较。2)这两个循环在毫微秒内完全相同的时间并不奇怪吗?这应该表明秒表的分辨率是不够的……准确地说,你测量它,你测量它是完全错误的。它可能不是错误的百分之几,而是错误的百分之几百万。乘法和加法所花费的时间远远少于计时器分辨率和循环开销。所有被破坏的基准都需要相同的答案,这就是为什么我将其作为一个副本来结束。你可以做出非常合理的选择尝试用JMH这样的工具来衡量这一点。仅仅因为事情是JIT和优化的,并不意味着它是不可测量的,或者任何可以想象的结果都是“随机噪声”。