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

news2024/11/29 12:53:38

前言:今天学长跟大家讲讲《快出数量级的性能是怎样炼成的》,废话不多说,直接上干货~

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

开源 SPL 提速保险公司团保明细单查询 2000+倍

开源 SPL 提升银行自助分析从 5 并发到 100 并发

开源 SPL 提速银行用户画像客群交集计算 200+倍

开源 SPL 优化银行预计算固定查询成实时灵活查询

开源 SPL 将银行手机账户查询的预先关联变成实时关联

开源 SPL 提速银行资金头寸报表 20+ 倍

开源 SPL 提速银行贷款协议跑批 10+ 倍

开源 SPL 优化保险公司跑批优从 2 小时到 17 分钟

开源 SPL 提速银行 POS 机交易报表 30+ 倍

开源 SPL 提速银行贷款跑批任务 150+ 倍

开源 SPL 提速资产负债表 60 倍

这是怎么做到的呢?这些被提速的场景都有一个共同点:原先都是用各种数据库(也有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 orderby x desc

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

select*from

(select y,*,row_number() over (partitionby y orderby 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))

这里 性能优化技巧:TopN 还有关于这个问题的更详细测试对比。

所以,我们做性能优化时要重写代码,不能继续使用SQL保持兼容。要读懂原来的逻辑重新实现,这个工作量还是很大的,不过能换来数倍数十倍的性能提升,常常还是值得的。另外,存储也非常重要,好算法要有合适的存储机制配合才能生效,所以不能继续把数据继续存在数据库里获得高性能,需要搬出来换种办法组织存放。改变存储后,有可能把原来需要缓存的计算过程变成不需要了,原来要遍历多遍的运算变成只遍历一次甚至不用遍历了,减少硬盘访问量对性能的提升非常有效。

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

换个角度再看这个提速原理:高性能靠的不是代码,而是代数,代码只是个实现手段而已。其中最关键的是掌握和运用这些算法,而不是SPL语法。SPL语法很简单,比Java容易多了,两小时就能基本上手,两三周就能比较熟练了。但算法却没那么简单,需要认真学习反复练习才能掌握。这些案例直接由没有经验的用户自己做常常效果并不好,主要原因也是对算法没有吃透。反过来,而只要掌握了算法,用什么语法就是个相对次要的问题了(当然用SQL这种太粗线条的语言还是不行)。这就像给病人看病,找出病理原因后,能分析出什么成分的药能管用。无论直接购买成药(使用封装过的SPL),还是上山采药(使用Java/C++硬写),都可以治好病,无非就是麻烦程度和支付成本不同。

可能有读者对SPL提供了哪些与SQL不同的高性能算法感兴趣,推荐一下乾学院上的性能优化图书 【性能优化】 前言及目录 和视频课程 《性能优化》课程我们已经把这些算法都整理成有体系的知识了。有些算法是业界首创的,其它教科书和论文中都找不到。跟着这些图书课程学习,掌握这些算法后,就可以自己写到快出数量级的高性能代码。即使自己不写代码,也能理解原理,不会再被很多大数据产品喊什么“万亿秒查”的说法忽悠了。

SPL资料


  • SPL官网

  • SPL下载

  • SPL源代码

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

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

相关文章

关于IDEA配置本地tomcat部署项目找不到项目工件的问题解答

文章目录一 原因分析二 解决方案三 具体的操作方法3.1 打开项目结构找到工件3.2 添加具体的工件内容3.3 配置本地tomcat一 原因分析 可能是之前的项目再次打开后&#xff0c;没有及时配置项目结构中的工件信息&#xff0c;导致配置tomcat中看不到工件的信息 二 解决方案 解决…

react组件优化,当父组件数据变化与子组件无关时,控制子组件不重新渲染

首先 我们来建立一个场景 我们创建一个react项目 然后创建一个父组件 这里我要叫 record.jsx 参考代码如下 import React from "react"; import Subset from "./subset";export default class record extends React.Component{constructor(props){super(…

工作的同时,我也在这里做副业

文章目录一、什么是独自开&#xff1f;二、独自开能给我们带来什么利益&#xff1f;三、如何使用独自开&#xff1f;3.1、用户任务报价步骤13.2、用户任务报价步骤2四、未来的愿景一、什么是独自开&#xff1f; 独自开&#xff0c;全称独自开发一套系统&#xff0c;是基于商品…

CTP开发(2)行情模块的开发

我在做CTP开发之前&#xff0c;也参考了不少其他的资料&#xff0c;发现他们都是把行情和交易做在同一个工程里的。我呢之前也做过期货相关的交易平台&#xff0c;感觉这种把行情和交易做在一起的方法缺乏可扩展性。比如我开了多个CTP账户&#xff0c;要同时交易&#xff0c;这…

springMVC的学习拦截器之验证用户登录案例

文章目录实现思路关于环境和配置文件pomspring的配置文件关于idea的通病/常见500错误的避坑实现步骤编写登陆页面编写Controller处理请求编写登录成功的页面编写登录拦截器实现思路 有一个登录页面&#xff0c;需要写一个controller访问页面登陆页面提供填写用户名和密码的表单…

UE4c++日记1(允许 创类、蓝图读写/调用/只读、分类、输出日志打印语句)

目录 1允许创建基于xx的蓝图类 2允许蓝图读写/允许蓝图调用/只读 读写调用 只读 3为变量/函数分类 4输出日志打印一段话 1.先创建一个蓝图类 2.构建对象 3.写提示代码&#xff0c;生成解决方案 4.运行&#xff0c;打开“输出日志” 5.总结 创类-实例化对象&#xff08;构建…

2022年个人年终总结(一)

2022年个人年终总结&#xff08;一&#xff09;考研想法的萌生回顾过去一年-考研心路历程基础阶段&#xff08;1-6月&#xff09;强化阶段&#xff08;7-9月&#xff09;冲刺阶段&#xff08;10-12月&#xff09;感受总结特别感谢2022年是做梦的一年&#xff0c;花了一年的时间…

Zookeeper相关操作

Zookeeper概念 •Zookeeper 是 Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务。 •Zookeeper 翻译过来就是 动物园管理员&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小 猪)的管理员。简称zk •Zookeeper 是一个分布式的…

【C++】非递归实现二叉树的前中后序遍历

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;二叉树的…

如何运营个人技术博客

前言 本篇和大家聊聊如何运营个人技术博客&#xff0c;定位下做技术写作的目的&#xff0c;有哪些交流平台和输出方式&#xff0c;如何把控内容质量&#xff0c;整理了一些写作技巧和自己常用的写作工具&#xff0c;最后分享下如何在有限的时间里合理安排保证写作与工作的平衡。…

第九届蓝桥杯省赛 C++ A组 - 付账问题

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;付账问题 &#x1f4e3;专栏定位&#xff1a;为想考甲级PAT的小伙伴整理常考算法题解&#xff0c;祝大家…

理解CSS

CSS 作为前端技术栈中关键一环&#xff0c;对页面元素及样式呈现起到了直接作用。本节课旨在通过对 CSS 的工作流程及原理、页面中 CSS 使用方法等详细解读&#xff0c;帮助前端新手建立对 CSS 的全面而深刻的认知。 CSS概念 CSS 即 Cascading Style Sheets&#xff0c;是用来…

认识涤生大数据的几个月,彻底改变了我

1自我介绍 大家好&#xff0c;我是泰罗奥特曼&#xff0c;毕业于东北的一所不知名一本大学&#xff0c;学校在一个小城市里面&#xff0c;最热闹的地方是一个四层楼的商城&#xff0c;专业是信息管理与信息系统&#xff0c;由于是调剂的&#xff0c;所以我也不知道这个专业是干…

[JavaEE]阻塞队列

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.阻塞队列的概念 2.标准库中的阻塞队列 3.生产者…

1999-2019年全国、各省市直辖区居民收入和消费支出情况面板数据

1999-2019年全国、各省市直辖区居民收入和消费支出情况面板数据 1、时间&#xff1a;1999-2019年 2、指标&#xff1a; 可支配收入、城镇居民家庭平均每人全年消费性支出、食品消费支出、医疗保健消费支出、农村居民家庭人均纯收入、农村居民家庭平均每人生活消费支出、食品…

【Unity URP】设置光源层Light Layers

光源层 (Light Layers) 功能允许配置某些光源仅影响特定的游戏对象。 此功能可以用于加亮在暗处的物体。 1.开启光源层&#xff0c;并设置光源层名称 在URP资源中&#xff0c;点击Lighting右侧的垂直省略号图标 (⋮)&#xff0c;勾选Show Additional Properties&#xff0c…

【已解决】WARNING: Ignoring invalid distribution xxx

问题解决方案解释问题 WARNING: Ignoring invalid distribution -umpy (c:\users\xxx\appdata\roaming\python\python36\site-packages) 解决方案 在报错的路径下(c:\users\xxx\appdata\roaming\python\python36\site-packages)&#xff0c;找到~对应文件夹&#xff0c;此处…

Pytorch实战笔记(1)——BiLSTM 实现情感分析

本文展示的是使用 Pytorch 构建一个 BiLSTM 来实现情感分析。本文的架构是第一章详细介绍 BiLSTM&#xff0c;第二章粗略介绍 BiLSTM&#xff08;就是说如果你想快速上手可以跳过第一章&#xff09;&#xff0c;第三章是核心代码部分。 目录1. BiLSTM的详细介绍2. BiLSTM 的简单…

【三年面试五年模拟】算法工程师的独孤九剑秘籍(第十二式)

Rocky Ding公众号&#xff1a;WeThinkIn写在前面 【三年面试五年模拟】栏目专注于分享AI行业中实习/校招/社招维度的必备面积知识点与面试方法&#xff0c;并向着更实战&#xff0c;更真实&#xff0c;更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优化ideas&#xff…

【算法】二叉树

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录二叉树数组转化为二叉树二叉树转化为二叉链表二叉树的遍历排序二叉树BST&#xff08;二叉搜索树&…