java - 性能测试中的第一个循环较慢

标签 java testing data-structures benchmarking

<分区>

我想亲眼看看某些数据结构的行为方式。我从 ArrayList 开始,并用自定义类的对象填充它。但是当我玩弄它时,我注意到在上面运行测试方法 X 时它的执行速度要慢得多,或者如果我第二次做同样的工作两次,速度会快 6 倍。

这里有一些例子:

private void generateItems(int amount)
{
    System.out.println("Populating list with " + amount + " items...");
    long time = System.nanoTime();
    for (int i = 0; i < amount; i++)
    {
        items.add(new Item("Type", "Subtype", random.nextInt(width), random.nextInt(height)));
    }
    System.out.println(timePassed(time) + " List size: " + items.size());
}

private void sortList(int x, int y)
{
    System.out.println("Sorting list...");
    long time = System.nanoTime();
    Collections.sort(items, new ItemComparator(x, y));
    System.out.println(timePassed(time) + " List sorted.");
    System.out.println("First: " + items.get(0));
}

现在让我们将这两个方法运行两次:

    items = new ArrayList<>();
    generateItems(100000); //33ms
    sortList(0, 0); //118ms

    items = new ArrayList<Item>();
    generateItems(100000); //5ms
    sortList(0, 0); //28ms

我知道当我对一个已经排序的列表进行排序时会花费更少的时间,因为计算机会更好地赌博结果,但在这里我生成了两个完全随机的列表。

我还有一些涉及迭代和条件项检索的方法,它们的行为都相同:第一个比稍后运行的要慢得多。

为了继续我对其他数据结构的测试,我想了解更多关于这种行为的信息。也许我在这里做错了什么或者结果是预期的,为什么?我如何进行这些比较可靠的测试?

最佳答案

Perhaps I'm doing something wrong here or is the outcome expected and why?

是的,Java 是默认带有 JIT 的 JVM。这意味着代码在运行时是动态编译的。因此,开始时它运行缓慢,但随着它获得有关程序运行方式的更好采样数据而加快速度。

您可以在命令行上使用-XX:+PrintCompilation 来查看一些细节。注意一些方法会被多次编译,有时会进行更昂贵的编译优化,有时是因为它有更好的数据来优化代码。

How do I make somewhat reliable tests like these?

简单的答案是重复运行测试并至少忽略基准测试的前 2 秒。

要获得更好的答案,请使用 JMH .默认情况下,这将运行每个测试 10 秒,超过 20 次,并在运行实际测试和编写微基准测试的许多更好方法之前忽略此预热。

关于java - 性能测试中的第一个循环较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104021/

相关文章:

c++ - 稀疏插入的数据结构

java - 尝试在空对象引用上调用接口(interface)方法sharedPreferences.edit()'

java - Stacktrace Java Eclipse 中的未知来源

java - 为什么与 RealmObject 相关的 RealmList 不更新?

java - Maven 耳朵和故障保护

c# - 向 TestServer 的 HttpClient 添加一个委托(delegate)处理程序(传出请求中间件)

algorithm - 计算滚动窗口中每秒的消息数?

javascript - 如何开发自定义 Protractor 定位器?

jquery - 在 qUnit 中测试整个页面重定向

r - 如何通过组合各个叶子路径来计算树的结果?