计时器代码无法正常工作

3

计时器Java代码无法正常工作

public interface IncDec
{
 void increment();
 void decrement();
}
public class MyIncDec implements IncDec
{
 private int x;
 public MyIncDec(int x) {
  this.x = x;
}
 public void increment() {
  this.x++;
 }
 public void decrement() {
  this.x--;
 }
}

第一部分:实现一个类,用于测量每个递增和递减方法调用需要的时间(以毫秒为单位),并打印出这些信息。该类应该与现有的IncDec接口客户端更或多或少地透明地融合。

我的解决方案:

public class Test{
public static void main(String[] args){
MyIncDec mid = new MyIncDec(4);
long l1;
long l2;

l1 = Calendar.getInstance().getTimeInMillis();
mid.increment();
l2 = Calendar.getInstance().getTimeInMillis();
System.out.println(l2-l1);
}
}

我的解决方案将时间差显示为0。当我在调用“increment”之前和之后显示长值时,它们是相同的。为什么会这样?

假设我需要在应用程序的许多地方执行类似的操作(方法调用计时)。一个想法是为所有不同的方法编写单独的计时器类。是否有另一个更优化的想法可以更方便地获取时间?


2
为什么你会期望你的方法调用需要整整一毫秒的时间。System.nanoTime更精确,但并非如此精确。 - Tom Hawtin - tackline
+1:一个很好的作业问题提问示例! :) - Adam Paynter
2
你到目前为止还没有接受过任何问题的答案。你是新来的,可能不知道这意味着什么。常见问题解答说:当你确定哪个答案对你最有帮助时,请点击答案左侧的复选框轮廓将其标记为被采纳的答案。这让其他人知道你已经得到了一个好的答案。这样做很有帮助,因为它向其他人展示你从社区中获得的价值。(如果你不这样做,人们通常会礼貌地要求你回去为更多的问题接受答案!) - oezi
1
你为什么删除了这个问题?如果你想要删除它,可以直接删掉,但是不要把它置为空的。 - Bobby
1
我再说一遍,如果你想删除这个问题,请直接删除它。但是不要留下一个浅显的问题。 - Bobby
3个回答

1
首先,您的时间差为0,因为运行时间可能少于1毫秒。尝试在您的“increment”方法中添加“Thread.sleep(50)”以查看是否有所改变。
 public void increment() {
  try { Thread.sleep(50); } catch (InterruptedException e) { }
  this.x++;
 }

其次,你的作业可能希望你在计算时间的类中使用IncDec接口。因此,请考虑这一点。学习什么是接口,它们用于什么以及更重要的是如何使用它们
祝你好运!

1

我认为你的作业建议你使用代理模式

我不会给你完整的解决方案,但这是一个提示:

public class MyIncDecProxy implements IncDec{

    MyIncDec incDec;

    public MyIncDecProxy(int x){
        //Initialise incDec
    }

    public void increment() {
        // Wrap the method of incDec implementing your timer
    }

    public void decrement() {
        //ditto
    }

}

然后您将使用MyIncDecProxy类而不是MyIncDec


-1
1. 我相信你的代码是可行的。你要感谢现代计算机:它们非常快。如果你想看到差异,请写一个循环 0..1000000,而不是单个调用 mid.increment()。或者以纳秒为单位测量时间。 2. 如果这不是练习而是真实任务,请使用 Java 分析器。有很多免费和商业分析器。这个工具将提供给您最好的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接