【问题标题】:Timing method causing code to run slow导致代码运行缓慢的计时方法
【发布时间】:2016-03-28 07:23:08
【问题描述】:

我正在优化我为圣诞节制作的一个 Java 小程序。我正在测试运行这些方法所需的时间,其中之一 Snow_AI 需要 1234567 纳秒才能运行。

问题在于计数器方法:

public boolean Count() {
    if (CreateCnt > CreateTime) {
        CreateCnt = 0;
        return true;
    } else {
        CreateCnt = CreateCnt + 1;
    }
    return false;
}

这就是我打电话的方式:

MethTmr1 = System.nanoTime();
    if (Snw.Count()) {
        MethTmr = System.nanoTime();
        Snw.Snow_AI();
        MethTPS = 1000000000 / (System.nanoTime() - MethTmr);
    }
    try{
        MethTPS1 = 1000000000 / (System.nanoTime() - MethTmr1);
    }catch(Exception e){}

当我在 If 语句中移动计时调用时,它会将运行时间更改为小于 5000。有人知道为什么计数器方法会导致这种情况发生吗?

【问题讨论】:

  • 愿意分享您是如何衡量的吗?请显示您衡量的两种方式。
  • Tmr = System.nanoTime(); 在方法调用之前和TPS = 1000000000 / (System.nanoTime() - Tmr); 在调用之后。我用它来测量帧速率和每秒滴答声
  • 你在哪里测量跑步时间?我只看到像 1/time 这样的代码会随着时间的增加而变低...?
  • 在 TPS 变量中:TPS = 1000000000 / (System.nanoTime() - Tmr); 有效,我之前在课程项目测试中使用过。
  • 但那是倒数的时间。越大越短。如果包含 if,您的代码看起来如何?

标签: java if-statement optimization


【解决方案1】:

你的测量有缺陷。

检查这个:Why is System.nanoTime() way slower (in performance) than System.currentTimeMillis()?

然后看看你的代码:

MethTmr1 = System.nanoTime();
if (Snw.Count()) {
    //expensive! Added to outer time
    MethTmr = System.nanoTime();
    Snw.Snow_AI();
     //expensive! Added to outer time
    MethTPS = 1000000000 / (System.nanoTime() - MethTmr);
}
try{
    MethTPS1 = 1000000000 / (System.nanoTime() - MethTmr1);
}catch(Exception e){}

基线。您的 MethTPS1 包括您的(快速)getCount()、您的 Snow_AI() 和 两个对 System.nanoTime() 的调用

这样尝试一次:

MethTmr1 = System.nanoTime();
if (Snw.Count()) {
    //expensive! Added to outer time
    //MethTmr = System.nanoTime();
    Snw.Snow_AI();
     //expensive! Added to outer time
    //MethTPS = 1000000000 / (System.nanoTime() - MethTmr);
}
try{
    MethTPS1 = 1000000000 / (System.nanoTime() - MethTmr1);
}catch(Exception e){}

【讨论】:

  • 我确实在单独的运行中做了 2 个计时器,我只是做了这样的代码来显示我正在测试的方式 :)
  • 此外,该代码仅用于测试,一旦问题得到解决,将被删除。
  • 我只能使用我看到的东西——然后请分享你真正测量的东西。你为你的测试做了多少次迭代?
  • 你所说的测试是正确的。导致速度变慢的不是我的 AI 方法。当我进行测试时,我将system.nanotime() 放在要测试的方法周围,然后运行程序进行 500 到 5000 次迭代,然后我转到下一个方法并执行相同的操作。在这个我做了同样的事情,但忘记删除 1000000000 / 所以就像你说的那样。
  • 整天看雪花会让你雪盲 ;-) 圣诞快乐 ;-)
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多