并行编程 - 性能改进
Posted
技术标签:
【中文标题】并行编程 - 性能改进【英文标题】:parallel programming - Performance Improvement 【发布时间】:2019-05-20 01:37:03 【问题描述】:我正在用SpringBoot写一个控制器,我的控制器是这样的
@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
public MyDto getData throws Exception
try
Mydto=new MyDto();
dto.setFirstName(someImpl.getFirstName());
dto.setLastName(someOtherImpl.getLastName());
dto.setAddress1(someImpl.getAddress1());
dto.setAddress2(someOtherImpl.getAddress2());
return dto;
catch()...
这里 someImpl 和 someOtherImpl 是接口,其中包含一些方法声明,我们从数据库中获取 getFirstName 和 getLastName,但是 getAddress1 和getAddress2 是硬编码值,我怎样才能让前两个 setter(名字和姓氏)在一个线程中运行,最后两个 setter(地址 1 和地址 2)在另一个线程中运行,这样我可以减少时间获取我的数据。
【问题讨论】:
使用多个线程不会加快速度。上下文切换的成本将远远超过进行一些方法调用的微不足道的成本(除非您在 setter 中做了大量工作)。 更重要的是,为什么你认为线程应该让它更快? 以此类推:如果您有 2 辆汽车在一条道路上行驶,那么修建另一条道路并不能帮助汽车更快地到达那里。一方面,您必须等到道路建成;然后你必须把车开到另一条路上;汽车仍然只能以相同的最高速度行驶;等 如果需要 10 秒,那么问题就完全不同了。究竟什么(!)需要10秒?它自己不能成为二传手。连接到数据库?外部服务? @ValentinCarnu:这家伙在某处有 10 秒的延迟,没有线程可以帮助他 【参考方案1】:逻辑就在那里,SomeImpl 将从 DB 中获取约 15 条记录,然后发送到 mapper,mapper 将从 15 中过滤约 5 个字段,然后将这 5 个值设置为 Dto。
您需要预先指定
从数据库中获取 15 条记录需要 10 秒 .. 这太多了。我仍然猜测问题出在其他地方,直到你证明不是这样
在这里,我们假设并行处理会对您有所帮助(线程切换和管理将比每个操作花费更少的时间)。请注意,从数据库中并行读取数据对您的帮助可能比您预期的要少。换句话说 - 这是如何并行执行操作,但我仍然不相信它会解决您的问题。
你可能真的从评论中读到了资源
解决方案是使用 CompleatableFuture 检索详细信息 并将它们设置到 dto 中。检查Guide To CompletableFuture 详情 – Valentin Carnu
你可以使用带有固定线程池的执行器服务
private static final ExecutorService fetchService = Executors.newFixedThreadPool(threadCount);
提交你的任务
final Mydto myDto =new MyDto();
Collection<Future> futures = ...
futures.add(fetchService.submit(() -> myDto.setSometing(...); ));
futures.add(fetchService.submit(() -> myDto.setSometingElse(...); ));
// wait until all completes assuming no other thread submit tasks
futures.forEach(f->f.get(););
我从头到尾写的没有正确验证语法,但你应该有这个想法
【讨论】:
我同意你的观点,让我解释一下,我从我的控制器调用 ~12 个 Impl 出 12 个 Impl ,9 个将调用 DB,平均每个 impl 将获取 ~15-20 条记录然后转到映射器并将其设置在 Dto 中。现在你可以想象为什么它占用了 ~10 @VinayHegde 好 :) 我真的希望并行处理对您有所帮助(尽管我默认情况下持怀疑态度,但不是个人的)。现在我看到您可能想要将 lambda 转换为 Runnable(我这里没有要验证的 Java)以上是关于并行编程 - 性能改进的主要内容,如果未能解决你的问题,请参考以下文章
并行编程双笙子佯谬 - 高性能并行编程与优化 - 视频教程目录