代码优化- 前端优化

news2024/9/21 4:28:44

常量折叠

基本思想:在编译期间计算表达式的值(编译时静态计算)

例如:a = 3 + 5 ==> a = 8,if (true && false) ... ==> if (false)

好处是:语法树的节点数量减少了,意味着编译器要维护的中间表示所要耗费的计算资源(比如内存)减少了;将来生成机器码的话,指令也减少了。

常量折叠把进行更深层次的优化的机会暴露出来了,例如上面的if (false),就可以进行死代码消除优化。

可以整型、布尔型、浮点型等数据类型上进行(依赖于我们编译的元语言的情况) 

语法制导的常量折叠算法

const_foid(Exp_t e)
{
    while (e is stiil shrinking)
        switch (e->kind)
            case EXP_ADD:
                Exp_t l = e->left;
                Exp_t r = e->right;
                if (l->kind == EXP_NUM && r->kind == EXP_NUM)
                    e = Exp_Num _new(l->value + r->value);
                break;
            case EXP_TIMES:
                ...
            default:
                break;
}

常量折叠小结

容易实现、可以在语法树或者中间表示上进行

通常被实现成公共子函数被其他优化调用

必须要很小心遵守语言的定义,例如:考虑溢出或者异常,0xffffffff+1 ==> 0 (要考虑整型数的溢出是否要抛异常?不能直接优化掉!)

代数化简

基本思想:利用代数系统的性质对程序进行化简

示例:

a = 0 + b    ==>    a = b        (0是加法的左零元)
a = 1 * b    ==>    a = b         (1是乘法的左单位元)
2 * a          ==>    a + a         (强度削弱)
2 * a          ==>    a << 1       (强度削弱)

同样必须非常仔细的处理语义

例如:(i - j) + (i - j)    ==>    i + i - j - j,其中i = j = 0xffffffff,优化前为0,优化后i + i溢出,抛出异常

语法制导的代数化简算法

alg_simp(Exp_t e)
{
    whiie(e is sti11 shrinking) 
        switch (e->kind)
            caseEXP_ADD : 
                Exp_t l = e->left;
                Exp_t r = e->right;
                if (l->kind == EXP_NUM && l->value == 0)
                    e = r;
                break;
            case...:
                ...;  // 类似
}

死代码(不可达代码)删除

基本思想:静态移除程序中不可执行的代码

示例:if (false)  s1;  else  s2;   ==>   s2;

在控制流图上也可以进行这些优化,但在早期做这些优化可以简化中后端

不可达代码删除算法

deadcode(Stm_t s)
{
    while (s is still shrinking)
        switch (s->kind)
            case STM_IF:
                Exp_t e = s->condition;
                if (e->kind == EXP_FALSE)
                    s = s->elsee;
                break;
            case ...:
                ...; // 类似
}

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

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

相关文章

STM32—0.96寸OLED液晶显示

本文主要介绍基于STM32F103的0.96寸的OLED液晶显示&#xff0c;详细关于0.96寸OLED液晶屏幕的介绍可参考这篇博客&#xff1a;https://blog.csdn.net/u011816009/article/details/130119426 一、简介 OLED被称为有机激光二极管&#xff0c;也被称为有机激光显示&#xff0c;O…

学生宿舍管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87700423 更多系统资源库…

Sprinboot聚合项目归荑

1、前言 在创建springboot项目时&#xff0c;都会有一个Main方法。如果将Springboot项目设计成聚合项目时&#xff0c;我们是不是要把所有的子项目都按照Springboot的方式创建呢&#xff1f;如果是会出现什么问题&#xff0c;以及我们怎么解决呢&#xff1f; 如果我们使用maven…

ChatGPT原理详解+实操

言 ChatGPT已近火了快大半年了&#xff0c;从去年刚出来的时候小编就关注了一下&#xff0c;也具体的使用过&#xff0c;然后就惊为天人&#xff0c;再然后就没有然后了&#xff0c;因为小编那段时间沉迷于AIGC了。ChatGPT今年开年后更是火的一塌糊涂&#xff0c;无论是行业内…

chatgpt智能提效职场办公-ppt怎么加音乐背景

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在 PowerPoint 中&#xff0c;您可以轻松地将音乐作为背景音乐添加到您的演示文稿中。下面是步骤&#xff1a; 打开您的 PowerPoint 演…

【大厂直通车】哔哩哔哩日常实习_测开面经

📑哈喽,大家好,我是小浪;本篇博客更新的是最新B站测开面经,本专栏非常适合目前准备找实习,或者准备冲秋招测试,测开方向的同学阅读订阅,持续更新各大厂真题面经,带你成为offer收割机!! 🧃对于订阅本专栏的同学们,博主在努力更新,只需要一杯奶茶钱,订阅本专栏,…

【命名空间】using namespace std是什么意思?

目录 一、前言二、命名空间2.1命名空间的定义2.2命名空间的成员调用2.2.1加命名空间名称及作用域限定符2.2.2使用using将命名空间中某个成员引入2.2.3使用using namespace 命名空间名称 引入 2.3命名空间的成员的优先级 三、using namespace std 一、前言 我们很多接触过C编程…

考了华为认证,如何找工作?能进哪些公司?有没有前景?

哪些人适合考华为&#xff1f;考了华为认证好不好找工作&#xff1f;这应该是困扰很多网工的问题。 俗话说&#xff0c;男怕入错行&#xff0c;女怕嫁错郎。如何选择一条适合自己的道路&#xff0c;提前做好职业规划&#xff0c;对个人职业发展至关重要。 下面就为大家整理了…

C#基础学习--预处理指令

目录 什么是预处理指令 基本规则 #define 和 #undef 指令 条件编译 条件编译结构 诊断指令 行号指令 ​编辑 区域指令 #pragam warning 指令 什么是预处理指令 源代码指定了程序的定义&#xff0c;预处理指令指示编译器如何处理源代码 基本规则 #define 和 #undef 指令…

基于uniapp+vue微信小程序的在职考研学习辅导系统

1系统具有良好的集成性&#xff0c;提供标准接口&#xff0c;以实现与其他相关系统的功能和数据集成。开放性好&#xff0c;便于系统的升级维护、以及与各种信息系统进行集成。功能定位充分考虑平台服务对象的需求。 一个微信小程序由.js、.json、.wxml、.wxss四种文件构成&…

CSS学习(4) - 链接,列表和表格

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 CSS链接CSS列表CSS表格 CSS链接 链接样式&#xff0c;通过 color font-family background 等来设置&#xff1a; a{color: hotpink;font-size: 30px; }可以指定不同的链接时刻来指定不同的样式&#xff1a; l…

Python中随机梯度下降法

随机梯度下降法 批量梯度下降使用全部的训练样本来计算梯度&#xff0c;并更新模型参数&#xff0c;因此它的每一次迭代计算量较大&#xff0c;但对于凸优化问题&#xff0c;可以保证每次迭代都朝着全局最优解的方向前进&#xff0c;收敛速度较快&#xff0c;最终收敛到的结果…

synchronized原理:

vm中每个对象都会有一个监视器Monitor&#xff0c;监视器和对象一起创建、销毁。监视器相当于一个用来监视这些线程进入的特殊房间&#xff0c;其义务是保证&#xff08;同一时间&#xff09;只有一个线程可以访问被保护的临界区代码块。每一个锁都对应一个monitor对象&#xf…

如何训练自己的大型语言模型

如何使用 Databricks、Hugging Face 和 MosaicML 训练大型语言模型 (LLM) 介绍 大型语言模型&#xff0c;如 OpenAI 的 GPT-4 或谷歌的 PaLM&#xff0c;已经席卷了人工智能世界。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;并且完全依赖少数大型科技公司…

LaoCat带你认识容器与镜像之Docker网络

近期比较忙&#xff0c;心思也比较乱&#xff0c;难得今天休息&#xff0c;闲来无事&#xff0c;借机更新一下系列 ~ 系列目录 LaoCat带你认识容器与镜像&#xff08;一&#xff09; LaoCat带你认识容器与镜像&#xff08;二【一章】&#xff09; LaoCat带你认识容器与镜像&…

软件安全性与隐私保护的最佳实践

在当今数字化时代&#xff0c;随着软件使用的普及和信息技术的发展&#xff0c;软件安全性和隐私保护越来越成为了IT领域关注的热点问题。在此&#xff0c;本文将探讨软件安全性和隐私保护的最佳实践&#xff0c;以帮助大家更好地保护自己的信息安全。 一、软件安全性最佳实践…

数据结构与算法八 优先队列

一 优先队列 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有优先级…

C语言-malloc、free、memset、realloc、strcpy

malloc()开辟指定内存空间 函数原型 void *malloc(size_t size) C 库函数 void *malloc(size_t size) 分配所需的内存空间&#xff0c;并返回一个指向它的指针。 free 释放内存空间 free C 库函数 void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的…

紧跟时代潮流,如用ChatGPT速成自媒体达人

每一个选题是否成为爆款和热门&#xff0c;这个就占了80%&#xff0c;为什么&#xff1f;因为我看到你的标题&#xff0c;我可以点进去啊&#xff0c;不管内容如何&#xff0c;至少让人眼前一亮&#xff0c;有点进去的欲望&#xff0c;至少浏览量会很大&#xff0c;这就成功了一…

【LeetCode: 1043. 分隔数组以得到最大和 | 暴力递归=>记忆化搜索=>动态规划 | 线性dp 区间dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…