Apache Camel 3.1 –更多骆驼核心优化(第2部分)

我以前曾在博客中介绍我们在下一个Camel 3.1版本(第1部分)中所做的优化 。

今天,我想发布大约4周后的最新状态更新。

我们集中在三个方面优化骆驼核心:

  • 不必要的对象分配
  • 不必要的方法调用
  • 提高绩效

换句话说,我们使Camel创建更少的对象,调用更少的方法并提高路由过程中的性能。

为了帮助识别骆驼核心中的这些问题,我们使用了一条简单的骆驼路线:

来自timer:foo

记录:foo

其他时候,我们专注于更长的路线:

来自timer:foo

记录:foo1

记录:foo2

记录:foo3

登录:fooN

或关注bean组件:

来自timer:foo

到bean:foo

等等。 我们还为计时器组件添加了一个不包含元数据的选项,因此消息不包含任何正文,标头或交换属性。 这使我们可以专注于纯路由引擎及其开销。

因此,所有这些共同帮助确定了许多较小的改进点,共同取得了巨大的成功。

tl:dr –显示数字

好吧,让我们先发布一些数字,然后再详细说明已完成的工作。

对象分配–(5分钟采样)

骆驼2.25 2.9 M创建对象

骆驼3.0 55 M对象创建

骆驼3.1 1.8 M对象创建

好的,我们必须承认Camel 3.0在路由过程中存在过多的对象分配问题。 没有内存泄漏,但是会创建很多不必要的对象。 我将在下面详细说明原因。

但是,有趣的是骆驼2.25和3.1之间的增益(创建的对象减少40%)。

方法调用–(5分钟采样)

骆驼2.25 139种不同的骆驼使用方法

骆驼3.0 167种不同的骆驼使用方法

Camel 3.1使用84种不同的Camel方法

上表列出了Camel在路由过程中从Camel调用的方法数量。 数据不包括JDK中的所有方法。 由于我们无法优化它们,但是我们可以优化Camel源代码。

从表中可以看出,我们已有改进。 骆驼3.1的使用率不到3.0的一半,比骆驼2.2.5的使用率低40%。

骆驼3.0

好的,所以Camel 3.0在使用过多内存方面存在问题。 一个重要的原因是新的反应式执行器现在可以通过事件循环执行路由中的每个步骤,方法是将任务移交给队列,并让工作人员执行任务。 因此,此切换现在需要创建其他对象并将任务存储在队列中等。

最大的一些成功是避免创建TRACE日志消息,不幸的是,无论是否启用了TRACE日志记录级别,始终都会创建该消息。 另一个大胜利是避免使用子元素创建路由过程的toString表示形式。 取而代之的是,骆驼现在只输出进程的id,这是一个快速的操作,并且不分配新对象。

另一个问题是使用java.util.stream的新代码。 这既是祝福也是诅咒(主要是对快速代码的诅咒)。 因此,通过使用普通的for循环,if结构并在核心路由引擎的关键部分避免使用java.util.stream,我们减少了对象分配。

Camel 3也是高度模块化的,例如,在Camel 2.x中,我们将所有类都放在同一类路径中,并且可以使用instanceof检查。 因此,在Camel 3中,我们有一些代码在执行此类检查时表现很差(再次是Java util流)。

另一个问题是被动执行器,它使用LinkedList作为队列。 因此,如果您有任务进入队列并且工作人员以相同的速度处理它们,因此队列为空/耗尽,那么LinkedList的性能会很差,因为它会不断分配/释放对象。 通过切换到预分配大小为16的ArrayQueue,则队列中始终有空间容纳任务,并且不会发生分配/取消分配。

还有更多优化,但是上面提到的优化可能是最大的问题。 然后,许多较小的优化组合在一起。

许多较小的优化

骆驼的UUID生成器正在使用一些字符串连接,这会花费很多。 我们减少了在消息和工作单元中生成UUID的需求,因此每个交换只生成1个。

骆驼路由引擎中的内部建议(建议= AOP之前/之后)。 这些建议中的一些具有从前到后都需要保留的状态,这意味着需要存储对象。 在我们为所有建议分配一个数组之前,即使对于那些没有状态的建议也是如此,因此存储了null。 现在,我们仅分配具有状态的建议的确切数目的数组。 (非常小的胜利,例如object [6] vs object [2]等,但这是在骆驼路线中的每一步发生的,所以总的来说是合计的。) 另一个胜利是,如果不需要内部路由处理器,则避免在UnitOfWork周围进行AOP。 这避免了额外的方法调用,并为after任务分配了一个回调对象。 由于所有这些都发生在路由的每个步骤中,因此是一个很好的改进。

一些最常用的EIP已经过优化。 例如

允许您使用其他MEP将消息发送到端点(但是很少使用)。 现在,EIP会检测到此情况,并避免创建用于恢复MEP的回调对象。 管道EIP(例如,当您执行->到-> to时)也对使用索引计数器而不是java.util.Iterator进行了一些改进,因为后者分配了一个额外的对象

骆驼还有一个秒表,它使用java.util.Date来存储时间。 已对其进行优化以使用长值。

另一个改进是事件通知。 现在,我们会预先计算其是否正在使用中,并避免在与路由消息相关的事件中一起调用它们。 顺便说一句,在Camel 3.0中,事件通知程序被重构为使用Java 8 Supplier的API和许多精美的API,但是所有这些都会产生大量开销。 在Camel 3.1中,我们已将通知程序恢复为与以前在Camel 2.x中一样,并进行了其他优化。

因此,让我以说……结束这个博客。 太棒了 Camel 3.1将使用更少的内存,通过不调用太多方法来执行得更快(请记住,我们可能不得不移动一些需要调用的代码,但是以不同的方式执行此操作,以避免调用太多的方法)。

在涉及的源代码方面,最大的变化之一是从使用ServiceSupport(Camel中很多东西的基类)中的基于实例的记录器切换为使用静态记录器实例。 这意味着将创建更少的Logger对象,这也是一种更好的做法。

更好的性能

其他改进是,我们将骆驼作为交换属性保留的某些内部状态直接移到了Exchange的字段中。 这样可以避免在属性映射中存储键/值,但是我们可以使用诸如boolean,int等原语。由于通过getter获取布尔值要比通过键在Map中查找值更快,因此这样做的效果也更好。

实际上,在Camel 3.1中,然后在常规路由期间,Camel不会从交换属性中查找任何此类状态,这意味着没有方法调用。 仍然有一些状态存储为交换属性(将来可能会改善其中一些状态,但是这些状态中的大多数仅很少使用)。 我们优化的是在路由过程中始终检查和使用的状态。

交换getProperty(5分钟采样)

骆驼2.25 572598 getPropety(字符串)

骆驼2.25 161502 getPropety(字符串,对象)

骆驼2.25 161502 getPropety(字符串,对象,类)

骆驼2.25 141962 getPropeties()

骆驼3.0 574944 getProperty(字符串)

Camel 3.0 167904 getPropety(字符串,对象)

骆驼3.0 167904 getPropety(字符串,对象,类)

骆驼3.0 91584 getPropeties()

骆驼3.1 0 getProperty(String)

骆驼3.1 0 getPropety(String,Object)

骆驼3.1 0 getPropety(String,Object,Class)

骆驼3.1 0 getPropeties()

如您所见,Camel 2.25和3.0查找了很多这种状态。 在Camel 3.1中,我们对此进行了极大的优化,并且根本没有查找-就像说状态以原始类型存储在Exchange上一样,JDK可以内联并执行得非常快。

以下屏幕截图显示了骆驼2.25和3.1。 (3.1的屏幕截图与昨天相比略有过时,此后我们对Camel进行了优化)。 请参见下面的屏幕截图:

好的,还有许多其他较小的优化,在撰写此博客时,我目前正在研究一个优化。 好的,让我结束这个博客,并保存第3部分的详细信息。

翻译自: https://www.javacodegeeks.com/2020/02/apache-camel-3-1-more-camel-core-optimizations-coming-part-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统的指令系统,计算机指令系统指的是什么呢?

2014-12-27计算机系统的指令由你哪两部分组成?共作用分别是什么?1。8086汇编语言指令由标号、操作码、操作数和注释组成,其中标号和注释可以省略,操作码指出指令要过盛的功能,操作数指出完成的对象。2。变量和标号的区别是变量由伪指令定义&a…

echarts怎么保存图片到剪切板上_在电脑上怎么批量给图片编号以及怎么自动记录记事本txt文档时间...

电脑日益成为我们日常办公不可或缺的工具,除了必要的软件使用之外,也有一些直到今天还不那么为人所熟知的小技巧。而小编今天就暂时为大家介绍两个颇为常用的小技巧~分别是如何将图片批量编号以及自动记录记事本时间。技巧一、图片批量编号旅行或者活动结…

计算机类qq网名,最帅的qq名字

qq这个聊天工具已经成为人们电脑里必备的软件,上到40~50的叔叔阿姨,下至8~9岁的小学生,都有qq这个聊天工具。qq是有可以随意改名字的功能,最长可以输入十几个字符作为名字。就是因为取名没有太多的限制,反而让人不知道…

c++中求解非线性方程组_齐次线性方程组的基础解系的简便算法

线性方程组的求解是线性代数中的基本技能,而齐次线性方程组的基础解系的求法又是基础。本文给出一个计算齐次线性方程组的基础解系的公式,从而简化计算过程。01 符号说明 n元线性方程组的矩阵形式:(1)齐次线性方程组;(2)非齐次线性方程组;系数…

python的if语句例句_Python入门之if条件语句

Besides the while statement just introduced, Python knows the usual control flow statements known from other languages, with some twists.除了之前介绍的while语句,Python同样支持其他语言通常用的控制流语句,但也有一些区别。 if Statements P…

esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...

2.FREERTOS任务创建、内核链表初始化硬件环境:cortex m4FreeRTOS版本:v8.0.1今天开始阅读freertos,阅读同时做下笔记,等哪天碰到移植问题再翻出来看看。2.1 任务、链表结构体源码中使用tskTCB来存储一个任务的所有信息,xLIST存储内…

Sigma IDE现在支持Python无服务器Lambda函数!

想想无服务器,使用Pythonic –全部在您的浏览器中! (好吧,这则新闻已经过了几周了,但是仍然……) 如果您沉迷于整个无服务器的“事物”中 ,您可能已经注意到我们,一个在SLAppForge臭…

idle不是python自带的开发工具_Python的开发工具

通常情况下,为了提高开发效率,需要使用相应的开发工具。进行Python开发也可以使用开发工具。下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后,会自动安装一个IDLE。它是一个Python shell(可以在打开的IDLE窗口的标题栏上看到…

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪,像其他专业团队成员一样,是采用OpenJDK的成员之一,但是从过去8个月就加入了,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等 。2.个别用户工作:个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274。大家好久不见,又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章,这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验,采用 DSP控制技术,为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分,该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”,用于处理文档。 在上一期文章中,我们已经使用Vavr库看到了一些模式匹配,并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族,每天坐在电脑前那么久,难免出现腰酸背痛的情况,时间长了甚至脊柱都歪曲变形了,这可不行!一定要克制住自己的坐姿。这里有款“隐形背背佳”,要不要了解一下?一位名…

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章,文章原作者mannulinux,文章来源:mannulinux.org 原文地址:http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考,具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本:EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注:标志为部署支持的环境,可以正常安装配置,但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机,手机,平板电脑或任何其他设备访问您的应用程序! …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月,以下为正文:CSS中有哪些字体属性呢?font:复合属性。设置或检索对象中的文本特征。font-style:设置或检索对象中的字体样式。用于定义字体的风格,如:斜体(italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!来源:https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台,JavaScript依然是web应用的核心语…