【发布时间】:2021-04-26 11:05:48
【问题描述】:
我有以下主要功能:
public static void main(String[] args) {
int times = 100;
double startTime = System.nanoTime();
for (int a = 1; a <= times; a++) {
BTree<Integer> testTree = new BTree<Integer>(1,3); // Creates BTree with root 1 and degree T 3
for (int i = 2; i <= 500; i++) {
testTree.BTreeInsert(i); // We insert up to 500 keys.
}
}
double stopTime = System.nanoTime();
System.out.println("Time: " + (((stopTime-startTime) / 1000000 / times)) + "ms");
}
我在这里尝试做的是测量将新密钥插入 B 树的执行时间最多 500 次。问题是我得到的时间测量有点小,所以我的老师告诉我要循环多次。
但是,我得到的结果似乎并不相加,使用此配置程序返回Time: 0.167(..) ms,同时使用times = 1,代码返回Time: 2.1401 ms.
我觉得我错过了一些重要的事情,但我不知道是什么。
【问题讨论】:
-
BTree定义为什么?您确定它没有错误并且编译器优化器没有妨碍吗? -
嗯,打印出来的时候你把时间除以
times。所以这告诉你,当你连续多次这样做时,它会更快。这是有道理的,因为准备 JVM 有很多开销 -
@CharlieArmstrong ,我明白了。我不知道如何看待它,因为我试图在没有任何开销的情况下找到它的执行时间,但至少现在我知道发生了什么。谢谢!
-
@Sanzor 测试执行时间是一项很难正确完成的任务,尤其是在 Java 这样的高级语言中。如果你有兴趣,here's 是一个更难诊断的例子。您可以使用几个 Java 库,它们将帮助您尽可能减少这种干扰。但是,如果这是一个学校项目,我只能想象您的老师正计划对此提出意见,他们可能希望您找到这种差异。
标签: java