Antlr4 社区重大贡献:TuGraph 优化 C++ Target 并发性能提升10倍!

Antlr4 ---遍历模式 Listener模式   使用ParseTreeWalker遍历树的过程中(深度优先),每次进入和退出规则节点时,触发对应的enterRule/exitRule方法。 使用示例 //step1:创建ParseTreeWalker ParseTreeWalker walker = new ParseTreeWalker(); //step2:创建ParseTreeListener和ParseTre... 阅读详情

(预计阅读时间:6分钟)

最近,TuGraph团队开展了一项令人振奋的优化工作,成功将Antlr4 C++ target的并发性能提升超过10倍!这一优化方案已被Antlr4开源社区热情接纳,将给全球的Antlr C++生态开发者带来更好的使用体验。PR地址:

https://github.com/antlr/antlr4/pull/4237

图片

图查询引擎是一种用于查询图数据库的工具,它使用特定的查询语言(如Cypher或ISO GQL)来执行和操作图数据库。这些查询语言允许用户描述图模式并查询图数据,例如查找特定节点或查找节点之间的路径。

关于Antlr4

Antlr4是一款备受欢迎的开源解析器生成器,能够根据语法规则快速生成自定义解析器。其支持LL(*)解析,拥有更强大的错误处理能力和更快的解析速度。不仅如此,Antlr4还支持Java、Python、C++、JavaScript、Go等10种目标语言,广泛应用于多种开发语言生态中。简单易用的API和文档使得开发人员能够快速上手。无论是编程语言、数据格式、编译器还是解释器等领域,Antlr4都发挥着重要作用。

著名的开源项目如Apache Spark、Eclipse IDE和MongoDB等都选择了Antlr4。 对于语言工具开发者而言,Antlr4是不可或缺的工具,能大幅提高开发效率和代码质量。

当TuGraph遇见Antlr4

ISO GQL(ISO/IEC 39075)是一种标准化的图数据库查询语言,蚂蚁集团是其主要贡献者之一。因此,Antlr4作为一种强大的解析器生成器,成为了蚂蚁图数据库TuGraph生成GQL解释器的理想选择。Antlr4能够帮助团队更快、更准确地构建图数据库的查询语言,从而提高产品性能和用户体验。

然而,当我们从开发场景来到生产场景,超高的并发量带来一个严重问题:Antlr4 C++ target的并发性能不足以支持所需的超高并发GQL请求。经过调研并与Antlr开源社区讨论,我们发现**并发性能这个问题普遍存在,并且在过去5年中持续困扰着C++生态的开发者。**我们决定解决这个问题。

我们做了哪些工作

在调研讨论的过程中我们发现,多位开发者在论坛提出其耗时甚至多于Java target数倍之多,见文末参考【1,2,3,4】。因此,我们决定从问题和开源代码出发,来定位、解决问题。

这是一个典型的并发程序优化问题,根据以往的程序优化经验,我们分步推进该问题的解决:

(1)识别问题

通过对程序运行时的性能数据进行收集和分析,我们找到了程序运行瓶颈所在,通过调用分析,初步将问题定位为数据竞争导致的并发问题。

(2)深入阅读Antlr4开源代码

接下来,我们对Antlr4的源代码进行仔细的阅读和理解,掌握其内部的结构和核心逻辑,找出了核心的数据结构和关键的调用链路。为我们破解性能难题和分析修改的正确性做好了准备。

图片

(3)梳理数据竞争链路

根据上述分析,我们判断问题的症结极大概率是数据竞争造成的。形成数据竞争至少有两个条件:一是线程之间共享内存数据,二是至少存在两个线程去读写某个共享内存。

进一步地,我们通过分析程序中的并发访问情况,找到了可能引发数据竞争的所有代码段和共享变量(主要为DFA、ATN等结构),拼接出了数据竞争的完整链路。

(4)破解数据竞争问题

数据竞争问题是多线程程序中常见而又复杂的问题,可以考虑通过破解多种竞争条件来解决。就本文问题来说,也存在多种破解方案选择,如何制定最优的解决方案是一项极具挑战的工作,主要难点有两个:

(i)保证修改后程序的正确性/稳定性

(ii)保证方案的有效性(低成本)

反复推演后,我们选择了提交给社区的优化方案(PR地址见参考【6】),即通过改变关键数据的ownership接触对锁的依赖。针对上述两个难点的分析如下:

经过源码分析并与开源社区讨论,我们确认关键数据结构的初始化构建是非常耗时的,但可以通过“只调用一次”(`call_once`)手段将成本均摊,而后续的增量构建相对开销较低,并且也可均摊。因此该优化方案的低时间成本是可以保证的。

图片

关于程序正确性的保证,我们通过双重验证来保证。首先在设计之初我们已经从源代码角度,推断出共享数据仍然是安全的,其次我们也设计了实验对此进行了验证,验证结果与我们的分析一致(见下图)。

图片

‍ 贡献和成果 ‍

优化的效果十分显著,32线程的并发性能提升超过18倍 ,如下图所示(16核心CPU测试平台,性能测试代码仓库见【5】)。考虑到实际生产服务器性能远高于测试机型,实际的性能提升效果将比测试结果更高, 优化后GQL解析能力已能完全满足企业业务的需要。

图片

充满收获的社区互动 ‍

‍

提案的互动过程曲折也充满乐趣。当涉及到多线程代码的修改时,官方开发团队会格外谨慎,因为这涉及到系统的稳定性和性能。他们会进行仔细的测试和评估,确保修改不会引入新的问题或降低系统的性能。为此社区引入了多达7名评审专家(一般提案的评审人多为1~2人),长达60多次的反复讨论不仅是评审专家理解提案的过程,也让我们了解了很多Antlr4代码背后深层的设计理念,可以更好地利用它来构建高性能、可维护的语法分析器。

通过此项优化工作,我们收获了更多与其他社区贡献者协作的经验,多位Antlr4社区成员也对TuGraph团队的工作表达了感谢,Antlr4负责人评价该提案为“一个重大的贡献”(a major contribution)。

参考文献

【1】antlr4 doesn't scale on a computer with 8 or more cores, https://github.com/antlr/antlr4/issues/2454

【2】Parsing with C++ target 5x slower than Java, https://github.com/antlr/antlr4/issues/2584

【3】Performance Issues Running Cpp Runtime on Many Threads, https://github.com/antlr/antlr4/issues/3938

【4】Why the C++ target is 6X slower than the Java target, https://stackoverflow.com/questions/52528982/why-the-c-target-is-6x-slower-than-the-java-target

【5】The test repo: https://github.com/wangtao9/antlr4-perfopt-test

【6】Optimize the concurrent performance of Cpp target by more than 10 times, https://github.com/antlr/antlr4/pull/4237

欢迎关注TuGraph!

图片

https://github.com/tugraph-family

https://tugraph.antgroup.com/

END

往期回顾

→ TuGraph阿里云免费试用 、技术正文,更有丰富互动奖品

→ 蚂蚁图数据库再获LDBC权威测试世界第一

→ 蚂蚁集团开源图数据库TuGraph,成立图计算开源委员会

▼ 关注蚂蚁图计算,了解最新资讯

【源码解析】C/C++开源代码解析引擎 C/C++代码解析,代码重构或后处理 阅读详情

相关推荐

生物信息学新手必看:MAFFT多序列比对从安装到实战(附参数优化技巧)

本文为生物信息学新手提供了MAFFT多序列比对工具的完整指南。从Linux环境下的安装部署,到核心算法策略(如FFT-NS-i、L-INS-i)的选择逻辑,再到空位罚分等关键参数的深度解析与优化技巧,手把手教你完成从原始序列到高质量比对结果的实战流程,为后续进化树构建等分析奠定坚实基础。

weixin_29230773的博客 486

复杂的动态布尔表达式性能评估(1)--Antlr4实现

  前言:   规则引擎中, 往往涉及到多个条件构成了复杂布尔表达式的计算. 对于这类布尔表达式, 一是动态可变的(取决于运营人员的设定), 二是其表达式往往很复杂. 如何快速的计算其表达式的值, 该系列文章将以两种方式, Antlr4动态生成AST(抽象语法树), 以及Groovy动态编译的方式来对比评估, 看看哪种方式性能更优, 以及各自的优缺点. 本篇文章将侧重于介绍Antlr4的实现思路....

weixin_34242819的博客 1378

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 421

探索ANTLR4:一门强大的语法解析器生成工具

探索ANTLR4:一门强大的语法解析器生成工具 是一个开源的、高度可定制的语言分析工具,它允许开发者定义自己的语法规则,并自动生成解析器和词法分析器。通过这款工具,你可以轻松地构建能够理解任何结构化文本或二进制文件的应用程序。 技术分析 ANTLR4的核心是它的语法描述语言(Grammar),这是一种基于EBNF(扩展巴科斯范式)的表达方式,使得编写复杂的语法规则变得直观且易于理解。工具本身会根据...

gitblog_00055的博客 1104

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

Windows沙盒神器Sandboxie Plus保姆级教程:从安装到实战测试可疑软件

本文详细介绍了Windows沙盒神器Sandboxie Plus的安装、配置与实战应用,帮助用户安全测试可疑软件。从系统要求、安装步骤到核心功能如多沙盒管理、文件共享和快照恢复,全面解析了这款轻量级沙盒工具的优势与使用技巧,特别适合需要隔离运行未知程序的用户。

weixin_29323049的博客 1157

C++使用ANTLR4

Antlr4 For C++ In Linux Antlr是什么 Antlr实际上做了两件事,一是翻译语法和词法,并生成相应代码,然后就是为翻译出来的语法词法代码提供运行时的支持 将Antlr4放入Linux 首先要确保Linux下有JDK环境,检查一下JVM是否存在,没有的话需要安装一下 下载Antlr的jar包,去Antlr的官网下载即可Download ANTLR 拿到jar包之后,在环境变量中添加这个jar包 # 假如我们已经下载了jar包,并知道他的位置,我是放到了/usr/local/l

qq_48201696的博客 5900

2、TCGA数据处理(差异分析前处理)

注意:1、是R语言中用于读取文本文件并创建数据框的函数。它可以从文本文件中读取数据并将其存储为数据框的形式,每一列代表一个变量,每一行代表一个观察值。2、括号要成对,不能少了;3、file = 'TCGA-LIHC.htseq_counts.tsv'引号可以是单或双引号,建议单;4、逗号主要中英文,都是用英文模式才没错;5、.tsv文件类型必须要有,不能删除,否则读不进来;6、上面代码将TCGA-LIHC.htseq_counts.tsv文件读入并赋值给count1。

PLW_12的博客 2668

ANTLR 学习 - 半山俗人 - ITeye技术网站

ANTLR 学习 - 半山俗人 - ITeye技术网站 ANTLR 学习 - 半山俗人 - ITeye技术网站 posted on 2016-11-09 17:...

138

【目标检测】基于yolov5的道路坑洼检测(附代码和数据集)

基于yolov5的道路坑洼检测(附代码和数据集)

学无止境、积少成多、厚积薄发 4620

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 92

ANTLR4(四) 基础设计语法

ANTLR4基础设计语法写在之前语言模式序列选择词法符号依赖嵌套处理优先级、结合性、左递归优先级结合性左递归核心语法标记总结词法结构匹配标识符匹配数字匹配字符串常量匹配注释和空格核心词法规则总结 写在之前 对于ANTLR的.g4文件来说,它的格式一般如下: //xx.g4 grammar xx 文法1: 文法2: 文法... 词法规则 词法1: 词法2: ... 注意的几点: 文件名和grammar关键字后跟的语法名应该一致。 文法规则和词法规则可以同时存在一个文件中,但文法以小写开头,词法以大写

pourtheworld的博客 7637

手把手教你学simulink(8.39)--基于Simulink的步进电机(Stepper Motor)仿真实例

通过这个仿真实例,你可以学习如何使用Simulink构建和仿真步进电机(Stepper Motor)系统。你可以根据实际需求调整模型和参数,进行更复杂的仿真和分析。希望这个例子对你有所帮助,祝你学习愉快!

MHD0815的博客 1052

【整理】ANTLR应用案例 | 在路上

【整理】ANTLR应用案例 | 在路上 【整理】ANTLR应用案例 | 在路上 posted on 2016-11-14 11:47lexus 阅读(...)...

176

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SparkSQL源码分析系列03-Antlr4分析测试

SparkSQL主要通过Antlr4定义SQL的语法规则,完成SQL词法,语法解析,最后将SQL转化为抽象语法树。所以有必要先了解下Antlr4的工作流程。

边看边学 630

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

antlr4使用

一、antlr的简介以及相关的准备处理 antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。简洁点说,antlr是用来解决编译、解释等相关的问题的。比如你要新定义一门语言,不管这语言复杂还是简单,都可以通过antlr来写这门语言的编译器以及解释器。 话不多说,使用antlr需要的准备工作有: 1.安装插件 在IDEA里Preference->Plugins里搜...

fxjwj1997518的博客 2163

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

技术动态 | 蚂蚁开源图数据库 TuGraph-DB升级到 v4.0,全新支持 GQL 国际标准查询语言...

转载公众号|TuGraph在2022年9月的世界人工智能大会上,蚂蚁自研图数据库TuGraph-DB 正式开源。正值开源一周年之际,迎来了开源TuGraph-DB v4.0版,期间经历了10次重要迭代,重大更新的功能包括云上部署、POG(Procedure On Graph query language)、Python算法接口、图学习引擎、高可用、ISO GQL等,在功能完备性、上手易用性、设...

开放知识图谱 1038

ANTLR应用场景

ANTLR是用java实现的一个语言识别器,它通过定义一个要识别目标语言的结构文件,然后用它的工具将该文件生成为可解析目标语言的java代码,利用生成的代码就可对目标语言进行解析。这种方式避免了自己编写java代码去解析文本,可利用ANTLR解析JSON,HTML,XML,EDIFACT,或自定义的报文格式。解析出来的信息需要做什么处理也可以在结构文件中定义。下面给出一些定义目标语言元素的描述方式

indexchen的专栏 3302

使用ANTLR4进行C++代码解析——持续更新中

ANTRL4的语法解析。

PPdouluo的博客 621

antlr4生成c_将ANTLR 4集成到C ++应用程序中

Recently I picked up a copy of The Definitive ANTLR 4 Reference and since I am sophisticated when it comes to working with grammars and languages I wanted to work on my DSL I once have written using y...

weixin_35147304的博客 373

第一章:antlr4 简介

antlr4 简介 ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Java语言编写,使用自上而下(top-down)的递归下降LL剖析器方法。由旧金山大学的Terence Parr博士等人于1989年开始发展。 ANTLR最初叫做PCCTS,Purdue Compiler Construction Tool Set,是 Terence Parr 在普渡大学攻读硕士学位时的创作,在

猫步旅人- 程序员的旅途 6365

ANTLR4学习笔记

ANTLR(Another Tool for Language Recognition)是一个强大的语言识别器生成器,最新的版本是ANTLR4。

rilegoule_的博客 1105

antlr4 C++入门 - antlr4 C++运行时的集成及遍历解析树

本文介绍了在C++项目中集成ANTLR4解析器的方法。通过计算器语法示例calculator.g4,演示了如何生成C++解析器代码(包含访问器和监听器)。详细说明了项目目录结构、CMake配置和主程序实现,展示了如何解析简单数学表达式"1+2*3"并输出解析树结构。环境使用ANTLR4 4.13.2、JDK11和VS2022/g++12编译器,最终成功生成了可执行的解析器程序,能够正确解析输入表达式并显示解析树。

itas109的专栏 669

基于ANTLR4+python解析设备树文件

引导程序要初始化并且引导一个计算机系统实现多种软件模块的交互。例如Bootloaders和hypervisors(固件)程序, 他们在把控制权交给操作系统软件之前可能需要在系统硬件上做低级的初始化工作。同时,bootloaders,hypervisos能够依次加载系统并把控制权交给操作系统, 使得在软件之间的交互变的标准化、接口化并且易用。在这个文档中引导程序被用作泛指那些初始化系统状态并加载执行操作系统的程序。boot引导程序主要包括:固件、bootloaders和hypervisors。

bgape002的博客 900

ANTLR4 教程

ANTLR4(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。这个开源项目基于Java开发,能够根据给定的语法规则文件生成对应的解析器。ANTLR广泛应用于DSL(领域特定语言)构建、语言词法语法解析以及静态代码分析等领域。它的目标是简化解析器的创建,并支持多种目标语言如Java、C++、Jav...

gitblog_01055的博客 1070

tpu_graphs:大型张量计算图的性能预测数据集

tpu_graphs:大型张量计算图的性能预测数据集 项目介绍 tpu_graphs 是一个面向 Tensor Processing Units (TPU) 的全张量程序性能预测数据集,以计算图的形式表示。每个图代表机器学习工作负载的主要计算过程,例如一个训练周期或推理步骤。每个数据样本包含一个计算图、一个编译配置以及该配置编译后图的执行时间。这些图从开源机器学习程序中收集而来,涵盖了流行的模型架...

gitblog_00732的博客 604
上一篇: 互动福利|免费试用阿里云端TuGraph图数据库,还有GoPro、filco键盘、苹果HomePod mini等你拿!...
下一篇: 恭喜!TuGraph 荣获 2022 中国开源创新大赛奖项
TuGraph
博客等级 码龄4年 183粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值