如何比较Java中的2方法?

如何比较Java中的2方法?,java,performance,methods,compare,Java,Performance,Methods,Compare,我在java中有两种方法(例如阶乘计算),我必须测试这两种方法以找出哪一种更快。我将该代码作为递归和for循环: 它们都在同一类数据中 public long FakultaetRekursiv( int n){ if(n == 1){ return 1; } else{ return FakultaetRekursiv(n-1) * n; } } public long

我在java中有两种方法(例如阶乘计算),我必须测试这两种方法以找出哪一种更快。我将该代码作为递归和for循环:

它们都在同一类数据中

    public long FakultaetRekursiv( int n){
        if(n == 1){
        return 1;
        }
        else{
        return FakultaetRekursiv(n-1) * n;
        }
    }


    public long Fakultaet( int n){
        int x=1;
        for(int i=1; i<=n; i++){
            x= x*i;
        }
        return x;       
    }
public long FakultaetRekursiv(国际北){
如果(n==1){
返回1;
}
否则{
返回FakultaetRekursiv(n-1)*n;
}
}
公共长廊(国际北){
int x=1;

对于(inti=1;i始终遵循基本原则!只需使用此项查找每个函数所用的时间

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = endTime - startTime;
//你的代码在这里

System.out.println(System.currentTimeMillis() - start + "ms");
,例如,使用正确的工具。下面是一个适用于您的示例:

import com.google.caliper.SimpleBenchmark;

public class Benchmark extends SimpleBenchmark {

    @Param({"1", "10", "100"}) private int arg;

    public void timeFakultaet(int reps) {
        for (int i = 0; i < reps; ++i) {
            Fakultaet(arg);
        }
    }

    public void timeFakultaetRekursiv(int reps) {
        for (int i = 0; i < reps; ++i) {
            FakultaetRekursiv(arg);
        }
    }

}
import com.google.caliper.SimpleBenchmark;
公共类基准扩展了SimpleBenchmark{
@Param({“1”、“10”、“100”)private int arg;
公共无效TimeDakultaet(int代表){
对于(int i=0;i

框架将多次运行tour
time*()
方法,而且它将注入不同的
arg
值并分别标记它们。

您也可以手动执行:

第一种方法可以用递归关系
F(x)=F(x-1)*x来描述,该递归关系生成模式

F(x) = F(x-1) * x
= F(x-2)*x*(x-1)
= F(x-3)*x*(x-1)*(x-2)
. . .
= k*n
哪个是O(n)


显然,第二种方法也可以用O(n)来描述,这意味着它们处于相同的上限。但这可以在实现计时解决方案之前用作快速检查。

好吧,当我想用您的解决方案修改代码时。我遇到了编译错误(无法访问语句)因此,我创建了另一个类
public long getLastRuntime(){long start=System.currentTimeMillis();return start;}
,并将我的新代码更改为
public long FakultaetRekursiv(int n){if(n==1){return return 1;}else{return FakultaetRekursiv(n-1)*n;}System.out.println(System.currentTimeMillis()-getLastRuntime()+“ms”);}
@altank52可能您是在
return
语句后粘贴的。请出示您的code@altank52粘贴
System.out.println(System.currentTimeMillis()-getLastRuntime()+“ms”);
before
return
在这里,它看起来不太好看,但肯定是:
公共类修改{public long getLastRuntime(){long start=System.currentTimeMillis();return start;}public long Fakultaet(int n){int x=1;for(int i=1;i当我将其粘贴到return语句之前时,整个循环返回0毫秒:(请确保您不要忽略测试方法的结果。有一次,我的整个方法在优化过程中被删除,因为结果从未在测试循环中使用。@MrSmith42:+1。卡钳文档中描述了这个问题,卡钳甚至试图发现它。我想让示例保持简短。非常感谢您谢谢你们的评论,伙计们。我从你们身上学到了很多。但我应该使用currentTimeMillis()的东西很少比较循环或递归方法的速度更快。有什么想法吗?您应该通过在存储所有可能值的数组中查找结果来实现它。这非常确定Fakultaet的最快实现。这两种方法都不会运行足够长的时间来进行优化或发挥作用。您应该更改递归实现以进行检查
n==0
而不是
n==1
,因为根据定义0!==1。并且可能会对负n值引发异常。如果我试图用代码修改它,我会得到一个“无法访问的语句”编译器错误。我如何修改?@MrSmith42 EDIT:你是对的!-我确实弄乱了我的大O符号。
F(x) = F(x-1) * x
= F(x-2)*x*(x-1)
= F(x-3)*x*(x-1)*(x-2)
. . .
= k*n