src/test/java
所以我有这段代码可以测量repeatString的运行时间
public class Runtime {
public static void main(String[] args) {
int[] n = {1,100,1000,10000};
for (int i=0; i<4; i++) {
StringRepeater s = new StringRepeater();
long start = System.nanoTime();
s.repeatString("hello", n[i]);
long stop = System.nanoTime();
long runtime = stop - start;
System.out.println("T(" + n[i] + ") = " + runtime/1000000000.0 + " seconds");
}
for (int i=0; i<4; i++) {
long start = 0;
long stop = 0;
long runtime100 = 0;
for (int j=0; j<100; j++) {
StringRepeater s = new StringRepeater();
start = System.nanoTime();
s.repeatString("hello", n[i]);
stop = System.nanoTime();
runtime100 = runtime100 + (stop - start);
}
System.out.println("T(" + n[i] + ") = " + runtime100/100000000000.0 + " seconds");
}
}
}
带有1 for循环的顶部计算1次运行的运行时间。具有2 for循环的底部计算基于100的平均值。但是由于某些原因,第二部分的运行时间通常要快得多,特别是对于较低的n。对于n = 1,它甚至快100倍。
public class StringRepeater {
public String repeatString(String s, int n){
String result = "";
for(int i=0; i<n; i++) {
result = result + s;
}
return result;
}
}
这是关于典型收益的信息。我的代码错误还是有其他事情发生。 TL:DL为什么平均运行时间比1x运行时间低很多?您希望它与之相当相似吗?
答案 0 :(得分:0)
有很多事情需要注意:
最好避免分割来监视执行时间,因为您可能会遇到精度问题。因此,第一个建议是:将速度时间保持在十亿分之一秒之内。
性能差异可能是由于及时编译所致:编译器首次执行代码时,需要一些时间来即时编译字节码。仅为了说明这一点,只需尝试反转代码中的循环即可。我帮你做
public class Runtime {
public static void main(String[] args) {
int[] n = { 1, 100, 1000, 10000 };
for (int i = 0; i < 4; i++) {
long start = 0;
long stop = 0;
long runtime100 = 0;
for (int j = 0; j < 100; j++) {
StringRepeater s = new StringRepeater();
start = System.nanoTime();
s.repeatString("hello", n[i]);
stop = System.nanoTime();
runtime100 = runtime100 + (stop - start);
}
System.out.println("T(" + n[i] + ") = " + runtime100 / 100.0 + " seconds");
}
for (int i = 0; i < 4; i++) {
StringRepeater s = new StringRepeater();
long start = System.nanoTime();
s.repeatString("hello", n[i]);
long stop = System.nanoTime();
long runtime = stop - start;
//System.out.println("T(" + n[i] + ") = " + runtime / 1000000000.0 + " seconds");
System.out.println("T(" + n[i] + ") = " + runtime + " seconds");
}
}
public static class StringRepeater {
public String repeatString(String s, int n) {
String result = "";
for (int i = 0; i < n; i++) {
result = result + s;
}
return result;
}
}
}
当我在计算机上运行此代码时,将获得以下结果:
T(1) = 985.31 seconds
T(100) = 109439.19 seconds
T(1000) = 2604811.29 seconds
T(10000) = 1.1787790449E8 seconds
T(1) = 821 seconds
T(100) = 18886 seconds
T(1000) = 1099442 seconds
T(10000) = 121750683 seconds
您可以看到,现在的100循环比单轮执行慢。这是因为它是在现在之前执行的。
3-如果您观察到以上结果,您可能会注意到现在的情况与初始情况完全相反。为什么?我认为这是由于垃圾收集器的工作。在更大的周期中,垃圾回收有更多的工作要做,只是因为有很多临时变量要垃圾。
希望对您有帮助。