当前位置: 首页 > 知识库问答 >
问题:

Java重复函数调用减少执行时间

空英达
2023-03-14

我有以下代码

public class BenchMark {
    public static void main(String args[]) {
        doLinear();

        doLinear();

        doLinear();

        doLinear();

    }


    private static void doParallel() {
        IntStream range = IntStream.range(1, 6).parallel();

        long startTime = System.nanoTime();
        int reduce = range
                .reduce((a, item) -> a * item).getAsInt();
        long endTime = System.nanoTime();
        System.out.println("parallel: " +reduce + " -- Time: " + (endTime - startTime));
    }

    private static void doLinear() {
        IntStream range = IntStream.range(1, 6);

        long startTime = System.nanoTime();
        int reduce = range
                .reduce((a, item) -> a * item).getAsInt();
        long endTime = System.nanoTime();
        System.out.println("linear: " +reduce + " -- Time: " + (endTime - startTime));
    }

}

我试图对流进行基准测试,但在一次又一次地调用相同的函数时,执行时间稳步下降

linear: 120 -- Time: 57008226
linear: 120 -- Time: 23202
linear: 120 -- Time: 17192
linear: 120 -- Time: 17802

Process finished with exit code 0

共有1个答案

裴嘉许
2023-03-14

我肯定JVM可能在幕后做了一些把戏,但有人能帮我理解那里到底发生了什么吗?

>

  • 第一次调用的巨大延迟是由于完整的lambda运行时子系统的初始化。你只为整个申请支付一次。

    当您的代码第一次到达任何给定的lambda表达式时,您需要为该lambda的链接付费(invokedynamic调用站点的初始化)。

    为了便于探索,您可以看到禁用JIT编译时代码的行为:将-xint传递给java命令。还有更多的标志禁用优化的各个方面。

  •  类似资料:
    • 在Spark中有几个优化可以减少批处理的时间。这些可以在优化指南中作了讨论。这节重点讨论几个重要的。 数据接收的并行水平 通过网络(如kafka,flume,socket等)接收数据需要这些数据反序列化并被保存到Spark中。如果数据接收成为系统的瓶颈,就要考虑并行地接收数据。注意,每个输入DStream创建一个receiver(运行在worker机器上) 接收单个数据流。创建多个输入DStrea

    • 问题内容: 我目前正在开发一个涉及在Rails服务器上同步联系人的应用程序。我正在使用Redis服务器和sidekiq在后台执行联系人同步。我的数据库是mongodb,我正在使用Mongoid gem作为ORM。工作流程如下: 电话上的联系人通过应用程序传递到Rails服务器,然后在Rails服务器上,它在Redis服务器中排队。 现在,cron作业会触发连接到Redis的sidekiq并完成作业

    • 我有一个对象数组 我需要这样的格式 我的代码是 但它的输出如下所示 请帮忙。谢谢你的时间

    • 这是python游戏的基本战利品表。 常见的,如果滴滚动到任何数字,包括13 不寻常,如果下降滚动14通过,并在18 如果跌落在19或20滚动 即使在满足条件的情况下,该程序也会忽略罕见掉落表,而是从罕见掉落表中取出一个项目,例如掉落=20 1000金币 有人能解释一下这里的问题吗?

    • 我试图找到一种方法来告诉一个函数在几秒钟内执行需要多长时间。目前我正在这样做: 但是每次我打印出秒时,它总是显示为-1。我研究了这个问题:经过的时间,但我需要输出以秒为单位。有什么建议吗?

    • 我有一个java。util。流动包含键值对的流,如: 现在,我想合并所有具有相同密钥的条目: 数据已经排序,因此只需合并连续的数据集。 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中。 我更喜欢得到一个java.util.stream.Stream,结果是一个不同的对象类型包含一个值列表,而不是一个单独的值。 我唯一的方法是一个自定义迭代器,它执行合并,但是转换为迭代器并