我正在尝试创建5个不同大小的ArrayLists,用0到1之间的随机数填充它们,然后时间(并打印)迭代每个值所需的时间。
我想我已经正确地初始化并填充了它们。但是当我遍历并检查时间时,数字是不正确的。当它们应该增加时,我得到类似于(0,0,2,0,0秒)的东西。
这是代码,有什么想法吗?
import java.util.*; // Imports all java.util subclasses.
public class Lab2 {
public static void main (String[] args)
{
System.out.println("#2");
int size1 = 100;
int size2 = 1000;
int size3 = 10000;
int size4 = 100000;
int size5 = 1000000;
// ArrayList 100.
ArrayList<Double> arrList1 = new ArrayList<Double>();
for (int i = 0; i < size1; i++)
{
arrList1.add(Math.random());
}
long startTime11 = System.currentTimeMillis();
for (int i = 0; i < arrList1.size(); i++);
long total11 = System.currentTimeMillis() - startTime11;
System.out.println("arrList1 Elapsed Time:" + total11);
// ArrayList 1000.
ArrayList<Double> arrList2 = new ArrayList<Double>();
for (int i = 0; i < size2; i++)
{
arrList2.add(Math.random());
}
long startTime12 = System.currentTimeMillis();
for (int i = 0; i < arrList2.size(); i++);
long total12 = System.currentTimeMillis() - startTime12;
System.out.println("arrList2 Elapsed Time:" + total12);
// ArrayList 10000.
ArrayList<Double> arrList3 = new ArrayList<Double>();
for (int i = 0; i < size3; i++)
{
arrList3.add(Math.random());
}
long startTime13 = System.currentTimeMillis();
for (int i = 0; i < arrList3.size(); i++);
long total13 = System.currentTimeMillis() - startTime13;
System.out.println("arrList3 Elapsed Time:" + total13);
// ArrayList 100000.
ArrayList<Double> arrList4 = new ArrayList<Double>();
for (int i = 0; i < size4; i++)
{
arrList4.add(Math.random());
}
long startTime14 = System.currentTimeMillis();
for (int i = 0; i < arrList4.size(); i++);
long total14 = System.currentTimeMillis() - startTime14;
System.out.println("arrList4 Elapsed Time:" + total14);
// ArrayList 1000000.
ArrayList<Double> arrList5 = new ArrayList<Double>();
for (int i = 0; i < size5; i++)
{
arrList5.add(Math.random());
}
long startTime15 = System.currentTimeMillis();
for (int i = 0; i < arrList5.size(); i++);
long total15 = System.currentTimeMillis() - startTime15;
System.out.println("arrList5 Elapsed Time:" + total15);发布于 2010-09-08 08:51:52
您没有在循环中做任何事情,所以它们很可能是被编译器优化出来的,根本不会被执行。
发布于 2010-09-08 08:58:23
我不确定为什么它们中的一些比其他的更早完成,除非它与JVM的数字缓存有关,但我可以说,使用nanoTime会产生更好的指标。http://ideone.com/ktCXP
发布于 2010-09-08 09:36:26
由于这是一个家庭作业练习,这里有一些关于编写Java微基准测试时需要考虑的事项的提示(如下所示):
1- Java编译器是智能的。如果他们发现你的代码的某些部分对代码的可视结果没有贡献,他们就会对其进行优化。
为了防止这扭曲您的基准测试结果,您通常需要确保您的基准测试循环以某种方式影响程序的结果。例如,让他们做一些对结果有贡献的廉价计算,并在becnchmark的末尾打印出结果。
2-JVM需要一段时间来“预热”。当您在一个典型的Sun JVM (和其他虚拟机)中启动一个应用程序时,您的代码最初由一个字节码解释器解释。一段时间后,JVM认为值得JIT将您的代码编译为本机代码……一个发生的情况是,你的代码开始运行得更快了。(但在JIT编译期间,它的运行速度可能会非常慢。)
为了防止这种情况扭曲您的基准测试结果,您通常需要安排您的循环(实际上是整个基准测试)多次运行。我通常会将整个基准测试作为一个方法,并在循环中多次运行它。然后,我看着这些数字,看看它们稳定的点,只关注那个点之后的数字。
3-涉及重复创建对象/数组的基准测试有在“随机”点触发垃圾收集的趋势。如果GC在基准循环中间运行(取决于GC设置),则运行该循环所需的时间可能会增加。根据你试图测量的是什么,这可能会给你带来异常的结果。
如果您试图排除垃圾收集开销,您可以将初始JVM堆大小设置为一个非常大的数字,这样GC就永远不会运行。或者,您可以通过眼睛或通过与GC日志文件中报告的GC运行关联来手动删除异常结果。
OTOH,如果您想包含GC开销,请使用典型的堆大小,大量运行循环,并计算每个循环的平均时间。
https://stackoverflow.com/questions/3663826
复制相似问题