快出数量级的性能是怎样炼成的

简介: 快出数量级的性能是怎样炼成的

正文


我们之前做过一些性能优化的案例,不算很多,还没有失手过。少则提速数倍,多则数十倍,极端情况还有提速上千倍的。提速一个数量级基本上是常态。下面是一些案例材料:


开源 SPL 提速保险公司团保明细单查询 2000+ 倍http://c.raqsoft.com.cn/article/1593677551526

开源 SPL 提升银行自助分析从 5 并发到 100 并发http://c.raqsoft.com.cn/article/1594819716739

开源 SPL 提速银行用户画像客群交集计算 200+ 倍http://c.raqsoft.com.cn/article/1597304345472

开源 SPL 优化银行预计算固定查询成实时灵活查询http://c.raqsoft.com.cn/article/1593424083742

开源 SPL 将银行手机账户查询的预先关联变成实时关联http://c.raqsoft.com.cn/article/1595490353934

开源 SPL 提速银行资金头寸报表 20+ 倍http://c.raqsoft.com.cn/article/1595292374988

开源 SPL 提速银行贷款协议跑批 10+ 倍http://c.raqsoft.com.cn/article/1596098387752

开源 SPL 优化保险公司跑批优从 2 小时到 17 分钟http://c.raqsoft.com.cn/article/1594119021002

开源 SPL 提速银行 POS 机交易报表 30+ 倍http://c.raqsoft.com.cn/article/1596352109236

开源 SPL 提速银行贷款跑批任务 150+ 倍http://c.raqsoft.com.cn/article/1594371863322

开源 SPL 提速资产负债表 60 倍http://c.raqsoft.com.cn/article/1598521512181


这是怎么做到的呢?

这些被提速的场景都有一个共同点:原先都是用各种数据库(也有HADOOP/Spark)上的SQL实现的,包括查询用的几百行SQL也有跑批用的几千行存储过程,然后我们改用集算器的SPL重新实现之后就有了这样的效果。

集算器SPL有什么神奇之处?是不是能让各种运算跑得更快?

有点遗憾,并没有这样的好事。集算器也是一个软件,而且是用Java写的,完成同样运算通常比C/C++写的数据库还要慢一点。

那是怎么回事?


根本原因在于我们用SPL实现了不同的算法。软件不能提高硬件的速度,但我们可以设计出更低复杂度的算法,有效地减少计算量,然后速度自然就上去了。一个运算任务本来要做1亿次加法,如果能减到100万次,那自然就能快100倍,即使每次运算都变得稍慢一点,总体性能仍然会提高,这一点也不神奇。

只要能实现高性能算法和存储,用什么技术来做并不重要了。用C/C++、Java当然都能做出来。事实上,集算器是用Java写的,用Java直接实现这些算法原则上还会更快一点,用C/C++ 一般还能更快(Java的内存分配消耗时间还是有点多)。

不过,虽然用Java和C++能写出比SPL更快的代码,但要长得多(估计会长出50-100倍),这会导致开发工作量过大,这在实际应用时也是要权衡的一个指标。有时候,跑得快和写着简单其实是一回事,就是能高效率地实现高性能算法。

集算器的SPL中强化了结构化数据的数据类型,并提供了很多基础的高性能算法。写代码就是组合运用这些算法,当然会方便得多。要说神奇之处,也就是这一点了。


那么,继续SQL就不能做到同样的事吗?

是的。SQL设计得过于粗线条,关系代数这个理论基础中缺乏很多数据类型和基础运算,很多高性能算法都无法描述,结果只能使用慢算法。虽然现在很多数据库和大数据平台都在工程上有所优化,但也只能针对简单的场景,情况复杂之后数据库的优化器都会“晕”掉,所以解决不了根本问题。这是个理论上的问题,无法在工程层面解决。

SPL基于的理论基础不再是关系代数,而是我们发明的离散数据集。在这个体系下有更多的数据类型和运算,就能写出更多高性能算法了。SPL是离散数据集的一种实现,封装了许多现成的算法。用Java和C++当然也能从头来实现这个代数体系,因而都能写出来高性能代码。而SQL却不可以。


举个简单的例子,我们想在1亿条数据中取出前10名,用SQL写出来是这样的:

select top 10 x,y from T order by x desc

这个语句中有个order by,严格按它执行就会涉及大排序,而排序非常慢。其实我们可以想出一个不用大排序的算法,但用SQL却无法描述,只能指望数据库优化器了。对于这句SQL描述的简单情况,很多商用数据库确实都能优化,使用不必大排序的算法,性能通常很好。但情况复杂一些,比如在每个分组中取前10名,要用窗口函数和子查询把SQL写成这样:

select * from
    (select y,*,row_number() over (partition by y order by x desc) rn from T)
where rn<=10

这时候,数据库优化器就会犯晕了,猜不出这句SQL的目的,只能老老实实地执行排序的逻辑(这个语句中还是有order by的字样),结果性能陡降。

而SPL不一样,离散数据集中有普遍集合的概念,TopN这种运算被认为是和SUM和COUNT一样的聚合运算,只不过返回值是个集合而已。这时候写出来的取前10名的语句中并没有排序动作:

T.groups(;top(-5;x))

分组后的写法也很简单,都不需要执行大排序:

T.groups(y;top(-5;x))


所以,我们做性能优化时要重写代码,不能继续使用SQL保持兼容。要读懂原来的逻辑重新实现,这个工作量还是很大的,不过能换来数倍数十倍的性能提升,常常还是值得的。

另外,存储也非常重要,好算法要有合适的存储机制配合才能生效,所以不能继续把数据继续存在数据库里获得高性能,需要搬出来换种办法组织存放。改变存储后,有可能把原来需要缓存的计算过程变成不需要了,原来要遍历多遍的运算变成只遍历一次甚至不用遍历了,减少硬盘访问量对性能的提升非常有效。


从上面这个原理上看,如果我们不能针对计算目标设计出更好的算法,那就做不到提速了。比如一个很简单的大表求和,用SQL要做1亿次,用SPL也要做1亿次,那就不可能做得更快,一般还会更慢一点(Java赶不上C/C++)。但是,当运算任务足够复杂时,碰到几百上千行的嵌套N层SQL(慢的SQL通常也不会太简单),几乎总能找到足够多可优化的环节,所以我们经历过的案子还没有失手过。结果,在实践上用Java写出来集算器大幅度超越了C/C++写的数据库,这都是算法造就的。


换个角度再看这个提速原理:高性能靠的不是代码,而是代数,代码只是个实现手段而已。其中最关键的是掌握和运用这些算法,而不是SPL语法。SPL语法很简单,比Java容易多了,两小时就能基本上手,两三周就能比较熟练了。但算法却没那么简单,需要认真学习反复练习才能掌握。这些案例直接由没有经验的用户自己做常常效果并不好,主要原因也是对算法没有吃透。

反过来,而只要掌握了算法,用什么语法就是个相对次要的问题了(当然用SQL这种太粗线条的语言还是不行)。这就像给病人看病,找出病理原因后,能分析出什么成分的药能管用。无论直接购买成药(使用封装过的SPL),还是上山采药(使用Java/C++硬写),都可以治好病,无非就是麻烦程度和支付成本不同。


SPL资料


SPL官网:http://c.raqsoft.com.cn/article/1595816810031

SPL下载:http://c.raqsoft.com.cn/article/1595816810031

SPL源代码:https://github.com/SPLWare/esProc


相关文章
|
人工智能 数据中心 异构计算
AI服务器电源设计:功率电感选型避坑指南
随着NVIDIA GB300等新一代AI芯片功耗突破千瓦级,GPU供电模块(VRM)正面临“大电流、高频化、高密度”的三重挑战。电感作为储能与滤波的核心元件,其选型直接决定了算力系统的稳定性与能效比。本文结合《AI服务器用一体成型电感》团体标准(2025征求意见稿)及一线大厂实测数据,深度解析AI服务器电感的五大核心指标、避坑指南及主流厂商方案,为硬件工程师提供一份可落地的选型手册。
749 0
AI服务器电源设计:功率电感选型避坑指南
|
存储 数据采集 NoSQL
数据为什么要分层?一文带你全面了解数仓分层
数据分层旨在实现数据的有序与可控,通过ODS(贴源)、DWD(明细)、DIM(维表)、DWS(服务)、DWT(主题)、ADS(应用)六层架构,逐级清洗、整合、聚合,提升质量、复用性与可追溯性,支撑高效、可信的数据分析。
|
自然语言处理 测试技术 决策智能
让RAG更聪明,ViDoRAG开启视觉文档检索增强生成新范式,上阿里云百炼可直接体验
视觉丰富文档的高效检索与生成是自然语言处理领域的重大挑战。ViDoRAG(Visual Document Retrieval-Augmented Generation via Dynamic Iterative Reasoning Agents)由阿里巴巴通义实验室、中国科学技术大学和上海交通大学联合提出,通过多智能体框架和动态迭代推理机制解决此问题。其核心包括多模态混合检索策略和多智能体生成流程,同时发布的ViDoSeek数据集,专为大规模文档集合设计,提供复杂推理与精准问答的评估基准。实验表明,ViDoRAG在准确率和效率上优于传统方法,未来将优化系统性能并降低计算成本。
1349 63
|
SQL Java 数据库连接
详解Mybatis之自动映射 & 自定义映射问题(上)
详解Mybatis之自动映射 & 自定义映射问题(上)
|
安全 JavaScript 编译器
QT调用IE浏览器COM插件完成网页浏览
QT调用IE浏览器COM插件完成网页浏览
893 0
QT调用IE浏览器COM插件完成网页浏览
|
JavaScript 前端开发
Vue中 实现函数的防抖、节流及应用场景
Vue中 实现函数的防抖、节流及应用场景
681 0
|
数据安全/隐私保护
|
Web App开发 前端开发
如何在CHROME里调试前端代码?
以前看前端们调得很神的, 刚看书到这里,作一个记录,演练了一下,确实有点神!!! :) DOCTYPE html> Debugging Intro var span = document.
967 0