当前位置: 首页 > news >正文

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识

JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐条翻译成机器码;而编译执行是提前翻译成机器码。编译执行又分为动态编译和静态编译,其中动态编译指在运行时进行编译,与之相对的就是静态编译。JIT编译就是动态编译的一种技术。优点:编译代码的速度快了,运行时根据运行态编译代码,少很多条件判断和无关代码,效率会很高;缺点:运行时需要进行编译产生机器码,带来额外开销。因此,需要针对不同情况进行测试和分析,评估带来的收益是否大于带来的开销。

1、LLVM

PgSQL通过LLVM(Low Level Virtual Machine底层虚拟机)进行代码生成。LLVM是一款开源编译器框架,我们主要关注LLVM IR的格式以及生成LLVM IR的API。IR全称是Intermediate Representation,即“中间表示”。Clang将PgSQL代码编译成中间表示.bc文件,然后通过LLVM根据运行时状态,将.bc动态编译生成最终执行的代码。

2、PgSQL编译与LLVM

PgSQL的执行器基于火山模型,执行计划树的每个节点定义为Plan,执行时遍历从树根开始执行计划树从而驱动执行器的执行。问题:计算过程中,无法明确操作的类型,需要频繁对类型进行识别,导致计算过程中产生了大量的动态类型识别需求;并且处理逻辑笨重:递归、封装、类型判断等这样的代码实现方式,带来频繁的函数调用以及缓存使用率低、对指令集不敏感等。PgSQL仅对表达式计算进行了JIT加速。首先从thinlto说起。

lto就是链接时优化,在编译阶段,Clang将PgSQL的.c文件编译成中间表示.bc文件,执行时通过LLVM将.bc文件进行链接优化和内联优化,最终根据执行状态生成执行需要的机器码。

传统的LLVM LTO,也就是通过clang -cc1 -flto生成原生字节码.o文件。在frontend层并行生成LLVM字节码文件,这个过程中有一些初始优化;linker层通过LLVM作为一个linker查进将所有字节码文件链接生成一个module的.bc文件;进行代码生成时,将.bc文件加载内存后通过优化和内联进行代码生成。Single-threaded very boring usual optimizations Potentially threaded CodeGen。在实践中,LTO通常需要大量内存(一次性保存所有IR)并且非常慢。若通过-g启用了调试信息,IR的大小和需要的内存还会显著增加。当任何输入源发生变化时,从LTO步骤开始的所有内容都必须重新执行,使得增量构建变得不太有效。

9c3d0842e693cccf1a999d63e709f172.png

ThinLTO:第一阶段frontend全并行处理+初始优化,生成.bc字节码文件,同时会为每个函数可生成summary信息。第二阶段:不需要解析IR中间表示代码,只需要将summary信息链接:thin-link。基于summary信息完全并行跨模块进行函数导入,导入的函数在内联后会被删除。第三阶段:进行优化后生成机器码,Fully-parallel (very boring) usual optimizations and CodeGen。它的串行步骤非常轻量且快速,不需要加载字节码合并单个庞大模块来执行这些分析,而是在串行链接步骤中利用每个模块的摘要进行全局分析。ThinLTO全局分析所启用的关键转换是函数导入,只有可能进行内联的函数才被导入到每个模块中。最大程度减少了每个ThinLTO后端的内存开销,同时最大化了最有影响力的跨模块优化机会。

e30ad5b9497c1bf6a118c64903d445c5.png

总之,ThinLTO的核心是将程序分为多个模块,每个模块可以独立进行编译和优化。然后通过使用一个索引文件(summary,也就是.bc的索引文件)来跟踪每个模块的信息,以便在链接阶段进行全局优化。这种方式可以减少编译时间和内存消耗,同时仍能够实现类似于WPO(例如GCC的-fwhole-program开关)的优化效果

PgSQL中configure时指定--with-llvm,然后生成的Makefile.global.in会带有对JIT的相关设置,使用thinlto技术生成带有模块摘要的IR:

22fa3d6e63dc4cc7da972a85df4b642f.png

install_llvm_module通过llvm-lto -thinlto -thinlto-action=thinlink对每个代码目录的文件夹生成摘要文件,比如生成字节码后在lib/postgres/bitcode目录下postgres对应postgres.index.bc。

Index.bc是bc文件的索引,bc文件的生成是通过clang编译C文件得到,bc文件级别编译时,还会有个优化,也就是编译过程中-O0、-O1、-O2的优化。在configure中指定:

7d158adbdcf729e635189d39bf3d3d1d.png

使用不同的编译参数会得到差异很大的bc文件,-O0时所有函数的noInline属性都是1,O2时才会有nonInline=0的函数,也就是代码生成时才能进行inline优化。

参考

https://llvm.org/devmtg/2016-11/Slides/Amini-Johnson-ThinLTO.pdf

相关文章:

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...

Go小记:使用Go实现ssh客户端

一、前言 SSH(Secure Shell)是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务,保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...

Nginx Spring boot指定域名跨域设置

1、Nginx配置跨域: server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …...

Database Advantages (数据库系统的优点)

数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…...

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…...

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...

C++ 并发专题 - 线程安全的单例模式

一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

力扣 LeetCode 541. 反转字符串II(Day4:字符串)

解题思路&#xff1a; i可以成段成段的跳&#xff0c;而不是简单的i class Solution {public String reverseStr(String s, int k) {char[] ch s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i 0; i < ch.length; i 2 * k) {// 2. 剩余字符小于 …...

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …...

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…...

Linux设置开机自动执行脚本 rc-local

使用/etc/rc.local 1、启动rc-local服务 首先授予执行权限 chmod x /etc/rc.d/rc.local设置开启自启并启动 sudo systemctl enable rc-local sudo systemctl start rc-local查看状态 sudo systemctl status rc-local2、编写要执行的脚本 vim /home/start.sh #!/bin/bash…...

驱动开发小问题 -记录一下

1 D:\Windows Kits\10\Vsix\VS2022\10.0.26100.0\amd64 D:\Windows Kits\10\Vsix\VS2019 2 windows防火墙白板 无法设置通过powershell防火墙禁用 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False 3 内核调试 vm虚拟机 设置成 NAT模式 &#xff…...

学习笔记018——若依框架数据权限功能的实现

ps&#xff1a;本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候&#xff0c;需要在表中添加user_id和dept_id两个字段。&#xff08;字段一定要一样&#xff0c;下文能体现&#xff09; user_id&#xff1a;表中该条记录的创建人id dept_id&#xff1…...

Nginx文件下载服务器搭建

Nginx文件下载服务器搭建 80端口启动下载服务器, 下载/var/www/downloads目录下的文件&#xff0c;nginx.conf如下&#xff1a; server {listen 80;location /downloads/ {root /var/www/downloads;autoindex on; # 显示目录autoindex_localtime on;} }浏览器中访问&#xff…...

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…...

HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)

文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…...

2411rust,1.80

1.80.0稳定版 LazyCell和LazyLock 这些"懒"类型会延迟初化其数据,直到第一次访问.它们类似1.70中稳定的OnceCell和OnceLock类型,但单元中包含初化函数. 这稳定化了从流行的lazy_static和once_cell中进入标准库. LazyLock是线安选项,使其适合静态值等位置.如,产生…...

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…...

Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局 认识了解一下Android中的布局&#xff0c;分别是: LinearLayout(线性布局)&#xff0c;RelativeLayout(相对布局)&#xff0c;TableLayout(表格布局)&#xff0c; FrameLayout(帧布局)&#xff0c;AbsoluteLayout(绝对布局)&#xff0c;GridLayout(网格布局) 等。 二、…...

大模型(LLMs)RAG 版面分析------文本分块面

一、为什么需要对文本分块&#xff1f; 使用大型语言模型&#xff08;LLM&#xff09;时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。 考虑以下场景&#xff1a;你面临一个几百页的文档&#xff0c;其中充满了文字&#xff0c;你希望对其…...

Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台

作为 Web3 游戏领域的领军者&#xff0c;Big Time Studios 不仅创造了热门游戏《Big Time》&#xff0c;还开发了 Open Loot 平台&#xff0c;至今交易量已超过 5 亿美元。如今&#xff0c;Open Loot 平台的活跃用户可以获得 $OL 代币&#xff0c;这是该平台推出的首个实用型代…...

Linux—ln(link files)命令使用方法(How to create links on Linux)

Linux—ln&#xff08;link files&#xff09;命令使用方法 在 Linux 系统中工作时&#xff0c;需要在不同的目录中使用相同的文件时&#xff0c;不必在每个目录下都复制一份文件&#xff0c;这样不仅浪费磁盘空间&#xff0c;还会导致文件管理上的混乱。 ln(link files) 便是…...

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

解决Oracle DECODE函数字符串截断问题的深度剖析20241113

解决Oracle DECODE函数字符串截断问题的深度剖析 在使用Oracle数据库进行开发时&#xff0c;开发者可能会遇到一些令人困惑的问题。其中&#xff0c;在使用DECODE函数时&#xff0c;返回的字符串被截断就是一个典型的案例。本文将以学生管理系统为背景&#xff0c;深入探讨这个…...

开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)

一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...

PHP框架 单一入口和多入口以及优缺点

在PHP框架中&#xff0c;单一入口和多入口是两种不同的应用架构设计方式&#xff0c;以下是关于这两者及其优缺点的详细解释&#xff1a; 一、单一入口 定义&#xff1a; 单一入口&#xff08;Single Entry Point&#xff09;指的是应用程序通过一个统一的文件&#xff08;通…...

PhpSpreadsheet导出图片

PhpSpreadsheet导出图片 //导出public function pdf($ids){$jzInfo $this->model->where(id,$ids)->find();try {//巡检人员$staff_ids \app\admin\model\inspection\Plan::where(id,$jzInfo[plan_id])->value(staff_id);$staff_names \app\admin\model\inspect…...

wordpress怎么上传/搜狗搜索网

vim文本编辑及文件查找详解vim编辑器深入讲解vim编辑器高效用法进阶文件查找命令企业级应用Linux特殊权限及facl扩展vim编辑器深入讲解 vim编辑器 文本编辑器&#xff1a;文本&#xff1a;纯文本&#xff0c;ASCII text&#xff1b;Unicode&#xff1b;文本编辑种类&#xff…...

加大政府网站建设/微信营销的方法有哪些

故障存储&#xff1a;WD2500AAJS-75M0A0 故障现象&#xff1a;加电后敲盘&#xff0c;电机停转 故障分析&#xff1a; 和用户沟通中得知此盘为DELL机器原装盘&#xff0c;正常开机使用过程中受外力机箱从桌子上摔下来&#xff0c;用户已经尝试把硬盘挂载到USB接口上进行读取的操…...

局域网创建网站/有趣的软文

出版社链接&#xff1a;http://shop.oreilly.com/product/0636920044765.do 代码链接&#xff1a;https://github.com/oreillymedia/Learning-OpenCV-3_examples 前言&#xff1a; 本书目的&#xff1a;目前&#xff0c;4方面趋势使得图像处理成为一个发展迅速的领域1 人手一手…...

永州做网站费用/成都百度推广联系方式

安装报错如图出错误提示看得出这款软件基于Microsoft .NET Framework 4&#xff0c;然后安装时发生了严重错误&#xff0c;从而导致语音助手安装不成功所以要解决这个问题就首先要成功安装.NET Framework 4下面是可以参考的解决方案&#xff08;不同的电脑原因不一样解决办法也…...

山东日照网站建设/千锋教育培训怎么样

Microsoft PetShop 3.0 设计与实现--数据访问层 最近对多层设计实现和.Net产生了兴趣&#xff0c;从而研究了一下比较著名的多层范例程序――PetShop&#xff0c;现在的版本是3.0&#xff0c;和以前的版本从设计上已有一定的区别&#xff0c;应该是和Java的Petshop设计相当。 关…...

营销型网站建设方案演讲ppt/百度手机助手应用商店下载

我们最常使用的应用&#xff0c;如淘宝、京东、抖音、微信等&#xff0c;全都是使用数据库来进行数据的存储。尤其是在接入互联网网民越来越多的情况下&#xff0c;业务系统经常会面临大量的数据请求&#xff0c;在一些大促场景&#xff0c;更会面临突然间的请求量剧增&#xf…...