随笔-156  评论-223  文章-30  trackbacks-0
1.闭包记录分配:若逃逸分析能识别哪些闭包记录在创建它们的函数中是出口不活跃的,则这些闭包记录可分配在栈帧中(不再是堆中)
2.内联扩展:由于小函数较多,因此内联可以免去调用开销而提高性能,对于递归函数,需先用循环前置头转换再内联,如果是尾递归函数,可先使用尾调用优化删除递归。如果一个函数的所有调用都被内联扩展,并且该函数没有作为参数传递或其它方式被引用,那么可以删除这个函数本身即函数定义。内联扩展可以继续作用于扩展后的函数体,只要存在函数调用,这也叫层叠式内联
3.循环不变量参数外提:递归函数经过循环前置头转换后,若每次递归调用头函数,传入的某些参数值总不变,则可以将它们从函数参数中删除,函数体中的每次使用出现用序曲函数对应的参数名替换
4.解开嵌套的let:将嵌套的多层let中的代码合并为一个let中的代码,in中的代码不变
5.避免代码膨胀:由于内联复制函数体,通常使程序体积变大,且层叠式内联可无限扩展下去,因此为避免代码膨胀,有如下启发式策略对内联进行控制
  a) 只内联执行很频繁的函数调用,可根据静态估计比如循环嵌套深度、迭代次数,或根据执行剖面分析反馈,计算函数的执行频率
  b) 内联很小的函数,其函数体不会比直接调用多出较多指令
  c) 内联只调用一次的函数,然后删除原来的函数定义
posted on 2023-09-07 06:47 春秋十二月 阅读(48) 评论(0)  编辑 收藏 引用 所属分类: Compiler

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理