首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java问题-- ArrayList和Time Elapsed函数

Java问题-- ArrayList和Time Elapsed函数
EN

Stack Overflow用户
提问于 2010-09-08 08:48:29
回答 7查看 852关注 0票数 2

我正在尝试创建5个不同大小的ArrayLists,用0到1之间的随机数填充它们,然后时间(并打印)迭代每个值所需的时间。

我想我已经正确地初始化并填充了它们。但是当我遍历并检查时间时,数字是不正确的。当它们应该增加时,我得到类似于(0,0,2,0,0秒)的东西。

这是代码,有什么想法吗?

代码语言:javascript
复制
    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);
EN

回答 7

Stack Overflow用户

发布于 2010-09-08 08:51:52

您没有在循环中做任何事情,所以它们很可能是被编译器优化出来的,根本不会被执行。

票数 3
EN

Stack Overflow用户

发布于 2010-09-08 08:58:23

我不确定为什么它们中的一些比其他的更早完成,除非它与JVM的数字缓存有关,但我可以说,使用nanoTime会产生更好的指标。http://ideone.com/ktCXP

票数 3
EN

Stack Overflow用户

发布于 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开销,请使用典型的堆大小,大量运行循环,并计算每个循环的平均时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3663826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档