我想得到一些关于乘法加法有多快的数字。我写了一个简单的代码,我将2个数字相乘,找到时间。然后我添加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());
}
}
我尝试了不同的x&amp;值。年。这是x = 10000和y = 5000的输出(所有时间都是以纳秒为单位)
乘法所需的时间是:61593
添加少量循环所需的时间是:1622599
添加更多for循环所需的时间是:1622599
如您所见,乘法比加法快几个数量级。
有什么原因吗?
答案 0 :(得分:0)
首先,它不清楚你要测量的是什么,因为你似乎是在比较单个乘法与在循环中进行多次加法。你不应该对后者变慢感到惊讶。
话虽如此,像这样的微基准测试基本上是随机噪声。乘法只是机器代码级别的一条指令。您可能会被任何类型的分支或函数调用淹没,以测量时间。为了在该级别获得准确的测量值,您必须使用特殊的装配说明。您还必须考虑乱序执行和流水线操作,因为现代CPU同时执行多条指令,尤其是在整数乘法等简单情况下。
除了JVM和Java的所有抽象之外,企业更加无望。 Java编译为字节码,而字节码又由JVM解释或JIT编译。 JVM具有广泛的自由度来执行它认为合适的任何优化,因此即使采用不同数量的字节码指令的操作也可能与最终性能几乎没有关系。