后端思维----并行优化性能

2023-11-10

目录

背景

实现

背景

今天学习了线性执行和并行执行的区别。

如果要同时去查询不同库里的不同信息,正常的小伙伴都是这么写:

public AppHeadInfoResponse queryAppHeadInfo(AppInfoReq req) {
    //查
    UserInfoParam userInfoParam = buildUserParam(req);
    UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam);
    //查
    BannerParam bannerParam = buildBannerParam(req);
    BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam);
    //查
    LabelParam labelParam = buildLabelParam(req);
    LabelDTO labelDTO = labelService.queryLabelInfo(labelParam);
    //组
    return buildResponse(userInfoDTO,bannerDTO,labelDTO);
}

 非常合理且没有毛病;但是本着后端要有优化思维,我今天学习了并行模式。

为什么要这样的?

比如第一个查询100s,第二个90s,第三个80s,这样下去就是270s,如果并行起来100s是不是就足够了,哪怕不能全并行,那也一定是更快的。

实现

CompletionService是对定义ExecutorService进行了包装,可以一边生成任务,一边获取任务的返回值。让这两件事分开执行,任务之间不会互相阻塞,可以获取最先完成的任务结果。

CompletionService的实现原理比较简单,底层通过FutureTask+阻塞队列,实现了任务先完成的话,可优先获取到。也就是说任务执行结果按照完成的先后顺序来排序,先完成可以优先获取到。内部有一个先进先出的阻塞队列,用于保存已经执行完成的Future,你调用CompletionService的poll或take方法即可获取到一个已经执行完成的Future,进而通过调用Future接口实现类的get方法获取最终的结果。

根据这个东西,手撸一个用例:(执行代码块使用计算斐波那契函数)

import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) {
        test1();
        System.out.println("------------------------------");
        test2();
    }

    public static void test2() {
        long beginTime = System.currentTimeMillis();
        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletionService<Object> completionService = new ExecutorCompletionService<>(executor);
        Callable<Object> taskList = () -> fibonacci(40);
        Callable<Object> taskList1 = () -> fibonacci(40);
        Callable<Object> taskList2 = () -> fibonacci(40);

        completionService.submit(taskList);
        completionService.submit(taskList1);
        completionService.submit(taskList2);
        try {
            //因为提交了3个任务,所以获取结果次数是3
            for (int i = 0; i < 3; i++) {
                Future<Object> baseRspDTOFuture = completionService.poll(1, TimeUnit.SECONDS);
                Object o = baseRspDTOFuture.get();
                System.out.println("o");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("------------------------");
        System.out.println("总时长:" + (System.currentTimeMillis() - beginTime));
        System.exit(0);
    }
    public static void test1() {
        long beginTime = System.currentTimeMillis();
        fibonacci(40);
        long secondTime = System.currentTimeMillis();
        System.out.println("1使用时间:" + ( secondTime - beginTime ));
        fibonacci(40);
        long thirdTime = System.currentTimeMillis();
        System.out.println("2使用时间:" + (thirdTime-secondTime));
        fibonacci(40);
        System.out.println("3使用时间:" + (System.currentTimeMillis() - thirdTime)  + "总时长:" + (System.currentTimeMillis() - beginTime));
    }

    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

贴出几个运行结果:

1使用时间:578
2使用时间:577
3使用时间:486

总时长:1641
------------------------------
总时长:607

1使用时间:615
2使用时间:518
3使用时间:377

总时长:1510
------------------------------
总时长:574

 效果显著。

今天又学习到了新知识!

---------------------------------------------------------------------------------------------------------------------------------

文章借鉴于田螺哥的公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后端思维----并行优化性能 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 拷贝构造函数中的浅拷贝与深拷贝

    拷贝构造函数 由 编译器 调用来完成一些基于同一类的其他对象的构建及初始化 1 构造函数调用规则 构造函数调用规则如下 默认情况下 c 编译器至少给一个类添加3个函数 默认构造参数 无参 函数体为空 默认析构参数 无参 函数体为空 默认拷贝
  • springboot获取静态资源文件夹下的文件

    第一种 package org springframework util URL url ClassUtils getDefaultClassLoader getResource classpath static image srcImgN
  • 基于CNN卷积神经网络的商品识别(毕设)

    一 研究背景及意义 当下 国内超市结算的方式大多都是人工扫码 在下班人流高峰期 显然这不是更高效的方式 无疑是增加了超市的人工成本及顾客的等待时间 二 目标检测的算法的选取 在单阶段目标检测算法中 目前主流的算法是YOLO算法与SSD算法
  • ReRes 过无限debugger

    条件 chrome 插件ReRes 已安装 ReRes安装 问题 以智慧树为例 打开开发者工具 发现进入断点模式 如图 我们并没有设置任何断点 也没有执行任何额外的脚本 它就直接进入了断点模式 这时候我们可以点击 Resume script
  • 卷积神经网络中图像池化操作全解析

    一 池化的过程 卷积层是对图像的一个邻域进行卷积得到图像的邻域特征 亚采样层 池化层 就是使用pooling技术将小邻域内的特征点整合得到新的特征 在完成卷积特征提取之后 对于每一个隐藏单元 它都提取到 r a 1 c b 1 个特征 把它
  • nginx + rtmp 集群搭建时遇到的一个坑

    使用nginx rtmp module的push功能搭建集群 即服务器A origin 接受推流 在application里配置push 推送到另外的几台服务器 edge 届时观看直播通过另外的几台服务器观看 结果在本地测试没有问题 放到客
  • 手机相机专业模式参数详解

    手机相机专业模式参数详解 1 M measure 大写的M 是指测光图标 下边有三个子图标 第一个矩阵测光 适合广阔的风景照 第二个中央测光 适合有主体画面中间的场景 第三个点测光 适合舞台摄影 2 ISO ISO是感光度 点击之后去拉那个
  • 全球及中国铁路行业十四五规划目标与投资建设状况分析报告2021版

    全球及中国铁路行业十四五规划目标与投资建设状况分析报告2021版 HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年11月 搜索鸿晟信合研究院查看官网更多内容 第一章 铁路相关定义及概述 1 1 轨
  • No such module 'Alamofire'解决办法

    试了很多办法都没有什么用 对于我的情况 所以我将项目中的文件移植到一个新建的项目中 并重新使用cocoapods安装第三方框架 就不会报错了 或者关闭重启Xcode 目前不知道是什么原因 知道的评论区留言 谢谢
  • 牙齿的X射线图像的语义分割(附代码)

    第一步结果 第二步结果 本研究的目的是通过使用U Net模型和二值图像分析的深度学习方法 在一次拍摄的全景x射线图像中自动语义分割和测量牙齿的总长度 以便为牙齿疾病 疾病和状况的管理提供诊断信息 模型结构 代码 coding utf 8 M
  • Python中datetime时间戳精确到单位的用法

    对于爬虫爬取到的文章存储到数据库时 有时需要到文档发布的时间进行处理 此时要用到datetime将时间精确到某一个单位 conding utf8 from datetime import datetime timedelta import
  • eclipse 使用maven 构建springboot+注入servlet

    本文转载至 http www cnblogs com java zhao p 5775103 html 问 有了springMVC 为什么还要用servlet 有了servlet3的注解 为什么还要使用ServletRegistration
  • 【计算机视觉

    文章目录 一 MIS Check Dam Minor Irrigation Structures Check Dam 二 MLGESTURE DATASET 三 Marine Microalgae Detection in Microsco
  • CDN上的缓存刷新、缓存预热是怎样的使用场景?

    缓存刷新 源站内容更新后 希望用户可以获取到最新资源 CDN租户可以通过提交刷新请求将CDN节点上指定的缓存内容强制过期 当用户再次访问时 CDN节点将回源获取已更新内容返回给用户并在节点缓存最新资源 简单来说就是删除cdn各节点上的缓存
  • 10. 拦截器的使用

    文章目录 拦截器概述 自定义拦截器 1 新建一个Moudule springmvc 05 Interceptor 添加web支持 2 导入pom依赖 并检查Artifacts的lib目录 3 配置web xml 和 applicationC
  • 查看 docker 容器使用的资源

    在容器的使用过程中 如果能及时的掌握容器使用的系统资源 无论对开发还是运维工作都是非常有益的 幸运的是 docker 自己就提供了这样的命令 docker stats 默认输出 docker stats 命令用来显示容器使用的系统资源 不带
  • 【小宝解惑】VC++中delete和delete [] 的区别

    我们通常从教科书上看到这样的说明 delete 释放new分配的单个对象指针指向的内存 delete 释放new分配的对象数组指针指向的内存 那么 按照教科书的理解 我们看下下面的代码 int a new int 10 delete a 方
  • shell脚本中的交互式变量(read)

    交互式变量 在执行时会互动 根据提示继续执行 read WESTOS read s WESTOS 无回显 隐藏 read p input WESTOS 会回显 编写脚本 会回显 执行发现会回显 编写脚本 不回显 发现输入过程会隐藏 之后显示
  • nginx 文件服务器 s3,利用S3+nginx实现静态站点的托管

    需求描述 用户有一个静态website 都是html和js css img这些文件 同时还有一个域名static website com 需要将用户访问的请求由nginx转发到后端的S3 website文件夹结构如下 website ind
  • 后端思维----并行优化性能

    目录 背景 实现 背景 今天学习了线性执行和并行执行的区别 如果要同时去查询不同库里的不同信息 正常的小伙伴都是这么写 public AppHeadInfoResponse queryAppHeadInfo AppInfoReq req 查