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

有关互联网网站seo优化sem推广

有关互联网网站,seo优化sem推广,沭阳金地建设网站,预约做家庭清洁的网站系列文章目录 欢迎大家订阅我的《计算机底层原理》、《自顶向下看Java》专栏#xff0c;我会持续为大家输出优质内容#xff0c;能够帮助到各位就是对我最大的鼓励#xff01; 目录 系列文章目录 前言 一、函数调用需要哪些开销 1.压栈于弹栈开销#xff1a; 2.寄存器保存于…系列文章目录 欢迎大家订阅我的《计算机底层原理》、《自顶向下看Java》专栏我会持续为大家输出优质内容能够帮助到各位就是对我最大的鼓励 目录 系列文章目录 前言 一、函数调用需要哪些开销 1.压栈于弹栈开销 2.寄存器保存于恢复开销 3.参数传递开销 4.栈帧生成开销 5.寻址开销 6.代码段切换开销 7.上下文切换的开销 8.内存访问开销 9.返回值传递开销 10.函数调用的指令开销 二、内联函数省略掉了哪些开销 1.函数调用开销 2.参数传递开销 4.代码段切换开销 5.指令开销 6.返回值传递开销 7.函数调用指令的开销 8.内存访问开销  三、内联函数到底做了什么  总结 一、函数调用需要哪些开销 1.压栈于弹栈开销         当函数被调用的时候、参数局部变量、返回地址等信息全部需要被压入调用栈也就是我们平常所说的函数栈帧函数执行完毕以后这些信息需要全部被弹出栈帧这些过程涉及到了栈的管理需要CPU一定的开销。 2.寄存器保存于恢复开销         函数的调用过程当中少不了进行各种运算以及各种临时变量的使用那么也就必然少不了用寄存器来存储各种临时变量和中间结果但是在函数调用的时候寄存器当中的值可能需要被保存到内存需要给下一个调用的函数使用函数执行结束以后再从内存当中恢复。         针对从内存中恢复这一点我多提一句当程序执行函数的时候、当前函数的执行状态包括寄存器当中的值是需要被保存的以便在调用另一个函数之后能够恢复这是因为在函数调用过程当中新的函数可能会使用相同的寄存器来存储临时变量和中间结果为了避免冲突当前函数的寄存器当中的值通常要被保存到内存当中然后在新的函数调用完成之后再从内存当中讲原来的函数数据恢复。         这个过程涉及到了两个关键的步骤保存和恢复。         保存在函数调用之前当前函数的执行状态包括寄存器当中的值被保存到内存当中的某个位置这确保了在调用其他函数的时候寄存器的内容不会被覆盖找不到或者意外修改。         恢复当调用的函数执行完成之后需要将之前保存的执行状态给恢复过来也包括寄存器当中的值这样当前函数可以继续执行并且在寄存器当中的值仍然是正确的。         这个过程的目的是确保在函数调用的层次结构当中每个函数都能够正常使用寄存器而不受其他函数的影响这种保存和恢复的操作会引入一些开销在性能优化的上下文当中程序员通常需要考虑如何减少这些开销以提高程序运行的效率。         好了说到这里的时候可能还会有很多的小伙伴一头雾水始终不明白一个函数好端端地执行着干嘛要保存起来去执行另外一个函数呢有同学会认为这个过程是中断的过程其实不然这个过程类似于中断但并不是中断因为函数本身调用的过程当中是大概率会调用到另外一个函数的注意是大概率不是一定。         这个过程涉及到了函数调用和程序的控制流虽然中断也涉及到了恢复和保存但是这里我们主要是在描述函数调用的情景。         在程序执行过程当中函数之间的调用时非常常见的一个函数执行好好的但是程序可能需要执行其他功能或者子功能这个时候就需要调用另外一个函数在函数调用的过程当中当前函数的执行状态包括寄存器当中的值需要被保存以确保调用的函数能够被正常执行而不受之前的影响。         我举一个例子就比如我们所熟知的主函数 main它要调用一个名为Add的函数计算一些数据的和在调用这个Add函数之前主函数需要保存当前的执行状态包括寄存器当中的值然后Add函数执行完毕之后主函数需要恢复到之前的状态继续执行。代码如下 #includeYangon.hint Add(int a, int b) {int c a b;return c; } int main() {int ret Add(2, 4);cout ret endl;return 0; } 3.参数传递开销         参数传递的方式有值传递、引用传递还有指针传递传递方式的不同开销也会不同传递一些占用内存很大空间的对象的时候可能会涉及到复制或者传递引用或者指针的开销。 4.栈帧生成开销         函数的每一次调用都会生成一个新的栈帧其中包含了局部变量、参数、返回地址等信息栈帧的生成于销毁都会引入开销。具体的开销分为以下几个部分。         生成栈帧开销首先需要分配内存空间系统会自动地位新的栈帧分配空间这通常涉及到将栈指针移动到新的位置并且在新的位置上为栈帧分配足够多的空间。分配好空间之后下一步就是初始化栈帧内的一些信息比如局部变量和参数、可能需要被初始化这包括将参数传递到栈帧中以及讲过局部变量的初始值设定为默认值或者特定的初始值。         执行函数体函数体当中的代码开始执行操作局部变量、参数等信息、这不是栈帧生成本身的开销但是在栈帧生成的过程当中函数体的执行也是一个开销。         栈帧销毁开销当函数执行完毕之后系统需要立刻释放该函数的栈帧占用的内存空间这通常涉及将栈指针移动会到调用函数最开始的位置从而丢弃整个栈帧。但是在销毁栈帧之前可能会需要进行一些清理的工作比如释放动态分配的内存关闭文件包等。         返回过程如果这个函数又返回值、需要将返回值传递给调用函数、这可能涉及将返回值存储在特定的寄存器当中或者放置在约定好的内存之上。这些过程当中的每一步都会引入一些开销尤其是在频繁地调用函数的场景当中。为了提高性能、编译器和程序员都需要进行一些优化策略比如使用寄存器来传递参数和返回值减少不必要的栈帧操作。 5.寻址开销         函数调用的时候需要寻找函数的入口地址这可能涉及到符号表的查找或者跳转指令引入一定的寻址开销。在程序执行的过程当中当一个函数被调用的时候、需要找到该函数的入口地址以便能够跳转到正确的位置执行函数体。         符号表查找编译时符号解析过程当中编译器会生成符号表其中包含了函数名和对应的入口地址当程序执行的过程当中调用函数需要根据符号表来进行以获取函数的入口地址。         跳转指令跳转到函数的入口一旦找到函数的入口地址程序需要执行跳转指令例如函数跳转指令或者函数调用指令来转移到函数的起始位置这个过程可能涉及到将程序计数器或者指令寄存器的值设置为函数的入口地址。         寻址开销影响符号表查找和跳转指令可能均未命中因为这些信息可能不再缓存当中缓存未命中就会引入额外的开销因为需要从内存当中加载相关信息。而且跳转指令也会影响流水线的性能因为跳转会引入分支现代处理器通常使用分支预测机制来减小分支带来的性能影响但是如果分支预测失效也会引入一定的开销。这部分的内容涉及到了计算机底层原理如果有兴趣的小伙伴可以去看我之前的文章。         所以这个时候为了减少开销编译器和硬件都需要采用一些优化策略例如使用相对寻址而不是绝对寻址采用间接寻址等。 6.代码段切换开销         如果这个函数不再当前执行的代码段当中可能需要进行代码段的切换这也会引入一些开销。代码段切换通常指的是当前程序从一个代码段切换到另外一个代码段时所引入的开销这种切换通常发生在函数调用或者模块加载等场景当中下面详细解释一下。         加载新的代码段当程序执行到一个新的函数或者模块的时候可能需要将新的代码段加载到内存当中去这就涉及到从磁盘或者从其他存储介质当中读取代码并且将其加载到可执行内存区域代码加载通常伴随着地址映射和分页操作确保代码在内存当中的正确位置并且可以被正确访问。         切换代码段当程序从一个代码段切换到另外一个代码段时需要调整程序计数器或者指令寄存器的值以指向新代码的入口地址         缓存效应切换代码段可能导致缓存未命中因为新的代码段的指令和数据有可能不再缓存当中这也会引入额外的开销因为需要从主内存当中加载新代码段的内容。 7.上下文切换的开销         在多线程或者多任务环境当中由于上下文的切换必然会引入额外的开销首先我们要知道什么是上下文切换上下文切换是指在多任务或者多线程当中环境当中从一个任务切换到另一个任务时保存当前任务的执行状态包括寄存器的值程序计数器的值等并加载另一个任务的执行状态这种切换会引入额外的开销。我下面为大家进行详细地讲解。         保存当前上下文在进行上下文切换之前系统需要保存当前任务线程的执行状态这包括寄存器的内容程序计数器的值堆栈指针等这些信息通常保存在任务的上下文块当中。         加载新的上下文切换到另一个任务的时候系统需要加载该任务的执行状态这涉及到将寄存器、程序计数器的值从任务的上下文块当中恢复以确保任务能够从上次中断的地方继续开始执行。        调度开销上下文的切换通常伴随着调度操作即选择下一个要执行的任务、调度器需要考虑任务的优先级时间片等信息这也会引入一些开销。        用户态和内核态的切换在多任务环境当中上下文切换可能涉及到用户态和内核态之间的切换这通常需要额外的指令和特权级的转换。         这里涉及到了很多操作系统的知识这不是我今天要讲的重点所以就不提了另外多说一句任务指的是进程或者线程而上下文的意思是值任务或者程序在执行的过程当中的当前状态和环境这个状态包括了一系列的信息使得程序或者任务被暂停的时候可以保存当前的执行状态以便之后能够正确地恢复和执行上下文的内容通常包括寄存器的内容、内存的状态堆、栈、数据区等信息、处理器状态、文件描述符和I/O状态吗其他状态信息。 8.内存访问开销         当函数调用的时候、可能会引起新的内存访问、例如访问函数体内的局部变量参数等这会影响缓存的命中率。内存访问开销指的是在程序执行过程当中由于函数调用而引起的内存读取或者写入操作带来的可能的开销这一过程可能包括对局部变量、参数、堆栈全局变量等的内存访问对缓存的影响是其中一个关键因素下面我为大家详细介绍关于内存访问开销的一些相关因素。         局部变量和参数当函数被调用的时候局部变量和参数通常存储在栈上访问这些局部变量和参数可能导致缓存未命中因为这些参数不再缓存当中如果局部变量被频繁地访问但是又没有很好地利用缓存可能会导致缓存的命中率下降、增加访问内存的开销因为缓存虽然容量小但是速度远快于内存。         栈操作函数调用和返回的过程当中栈上的数据被频繁地读写这可能导致缓存行的失效特别是如果相邻的栈帧被频繁地读写。         全局变量和静态变量全局变量和静态变量通常存储在数据段或者BSS段当中、访问这些变量可能会引起缓存未命中尤其是在全局变量较多的程序当中。数据段和BSS段都是静态区当中的区域数据段用于存储已经初始化的全局变量而BSS段则用于存储未初始化的全局变量和静态变量因为这些数据存储于静态区而静态区是内存的空间所以访问这些变量的时候可能就会引起缓存未命中这意味着处理器在尝试访问这些变量的时候发现它们不再缓存当中许需要从内存当中加载这可能就会导致额外的访存延迟影响程序的性能特别是在又大量的全局变量的程序当中。         堆操作如果函数调用导致对堆内存的操作如动态内存分配和释放这也可能会影响缓存的性能频繁的堆操作可能导致缓存行失效尤其是在多线程的环境当中 9.返回值传递开销         返回值的传丢方式不同也会影响开销返回较大的对象的时候可能会需要进行复制或者返回引用或者指针这里接涉及到了值传递和引用传递还有址传递。 10.函数调用的指令开销         生成和执行函数调用的指令本身也会需要一些开销。在大多数情况下这些开销相对较小但是在对性能要求较高的场景中可以考虑使用内联函数避免过多的函数调用接下来我就为大家详细讲解内联函数做了什么。 二、内联函数省略掉了哪些开销 1.函数调用开销         内联函数会在编译的时候将函数体的代码展开插入到调用处而不是通过函数调用的方式这避免了函数调用和返回时的栈帧生成与开销。 2.参数传递开销         内联函数可以避免一部分参数传递的开销因为参数值直接被插入到调用点而不需要通过栈或者寄存器传递。 3.寄存器保存与恢复开销         内联函数的调用避免了函数调用时候的栈帧生成因此不需要保存和恢复寄存器当中的值。 4.代码段切换开销         内联函数已经将代码段直接插入到了调用处、不需要进行代码段的切换。 5.指令开销         内联函数避免了生成和执行函数调用的指令本身的开销。 6.返回值传递开销         返回值也可以直接插入到调用点减少一次拷贝的开销。 7.函数调用指令的开销         函数体直接插入到了调用点自然也就不需要函数调用的指令开销了。 8.内存访问开销         内联函数可以减少内存访问的开销因为局部变量和参数直接嵌入到了函数调用点。 三、内联函数到底做了什么  到了这里可能已经又很多小伙伴明白了所谓的内联函数顾名思义就是编译器在编译的时候在函数的调用处直接将函数体展开这样可以省却很多的开销很多短小却频繁调用的函数需要使用内联函数进行优化内联函数的关键字是inline。 #include iostream using namespace std;inline int Add(int a,int b){int c a b;return c; } int main() {int ret 0;for(int i 0;i 100; i){ret Add(i,i1);}return 0; }         例如这个地方这个函数如果内部并不复杂而且多次被调用的话,建议使用内联函数进行优化但是并不是程序员只要使用inline修饰编译器就一定会将这个函数当作内联函数来处理这个关键字对于编译器来说知识一个建议因为内联函数并不是尽善尽美因为每一次遇到内联函数都要将其展开的话我们编译生成的目标文件就会变得膨胀冗余所以内联函数也要合理使用。 总结 这篇文章主要为大家讲解了函数调用所需要的开销以及内联函数的功能内联函数可以为函数的调用节省掉许多的开销这篇文章涉及到了很多关于函数调用的知识这其中又穿插了很多关于操作系统和计算机组成原理的相关知识不管是考研还是就业这部分的知识都是非常有用的希望能够帮助到大家
http://www.huolong8.cn/news/304251/

相关文章:

  • 网站服务器失去响应有没有哪些可以看片的
  • 建设环评备案登记网站中国最大的中文网站
  • wordpress微信登录插件下载网站加速优化
  • 不用服务器怎么做网站丰台高端网站建设
  • 唐山网站公司建站系统开发项目管理
  • 河北交通建设投资集团公司网站在线定制签名
  • 做网站设计公司价格今天全国生猪价格一览表
  • 自己公司网站自己能做吗进入兔展网站做PPt
  • 青岛胶南做网站的十堰企业网站制作公司
  • 设计网站架构购物平台口碑最好的是哪个
  • 企业门户网站的安全性wordpress底部footer
  • 网站 seo 优化建议东莞个人网站制作
  • 天津武清做网站的公司动漫风格网站
  • 观澜小学网站建设搜索引擎seo如何优化
  • 太原网络推广网站自己怎么开发社交app软件
  • 网站建设设计主要系统张掖网站设计公司
  • 丹灶网站设计wordpress 导航下拉
  • 电商 网站模板微网站建设包括哪些内容
  • 推广型网站如何建站纯html网站开发工具
  • 建设兼职网站目的福州城市建设规划网站
  • 泰州住房和城乡建设厅网站首页辽宁个人网站建设口碑推荐
  • 网站建设的制度开发网站开始的工作
  • 怎么给网站制作二维码微信小程序开发300元
  • 做h的小说网站婚恋网站怎么做
  • 河南网站建设运营域名注册公司公司网站开发项目管理制度
  • 手机怎么浏览国外网站个人承接网站开发项目
  • 物流企业网站建设步骤移动端模板 wordpress
  • 北安网站设计网站一年的费用
  • 万网影合肥seo代理商
  • 网站结构的规划与设计购买网站建设需要注意