System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术涉及程序编译优化领域,更具体地,涉及一种编译器性能优化方法。
技术介绍
1、编译器(compiler)是一种程序,它会将某种高级程序语言写成的原始代码(c、c++代码等)转换成另一种表示(机器二进制语言)。
2、编译器主要的目的是将便于人编写、阅读、维护的高级计算机语言,翻译为计算机能解读、运行的机器语言,也就是可执行程序。源代码一般为高级语言(high-levellanguage),如pascal、c、c++、c# 、java等,而目标语言则是汇编语言或目标机器的目标代码(object code),有时也称作机器代码(machine code)。
3、一个现代编译器的主要工作流程可参见图1:
4、优化pass介绍:
5、pass是编译器中用来对程序进行优化或分析的步骤,一个程序通常要经过多个pass,每个pass也可能执行多遍。
6、下面以clang/llvm架构为例介绍优化pass。
7、将llvm ir转换为目标汇编代码需要经历若干步骤。ir被变换为后端友好的指令、函数、全局变量的表示。这种表示随着程序经历各种后端阶段而变化,越来越接近实际的目标机器指令。图2给出了必需的步骤,从llvm ir到目标代码或者汇编,是可以执行的非必需优化pass以进一步改进翻译的质量。
8、这个翻译流水线由后端的多个阶段组成,它们在内部也称为super pass,因为它们由若干小的pass实现。它们和其它的步骤相比,前者这些pass对后端的成功很关键
9、图2是llvm后端的执行流程图,图2中示出了优化passes,一个passes可能接连做多个优化pass,其它为处理过程。
10、能作为优化的输入与输出的中间表示,中统称为ir,如clang/llvm中的ir、mi、mc等。
11、除了优化passes之外的其它处理过程是编译时必须的,优化pass一般是可选的,但如果做了优化得到的最终代码会更优,不是每个优化对特定代码都有正向的优化作用。
12、在编程过程中,程序员会频繁修改代码,并重新编译。虽然使用cmake等编译系统,能够实现增量编译,尽量减少需要编译的文件数。但该增量方式根据文件是否被修改来判断是否需要重新编译,此种方式是文件级别的。大部分情况下,程序员只是修改文件中的某几个函数,但会导致整个文件及其依赖重新编译。即使只是对文件多加了个空格,也会导致大量文件重新编译。
13、在编译一个程序的过程中,编译优化会占用大半的时间,一个现代的编译器,一般有多达100个以上的优化pass,然而这些pass并不总是有效的,也就是说即使运行了,也不会对代码有任何改变。这些无效优化pass的运行,白白浪费了大量编译时间,影响编译器的使用体验。
技术实现思路
1、本专利技术针对现有技术中存在的技术问题,提供一种编译器性能优化方法,包括:
2、第一次编译时,记录程序代码中每一个函数做完每一个优化前后函数ir的哈希值,ir是指编译过程中的中间表示;
3、根据每一个函数执行每一个优化前后函数ir的哈希值是否发生变化,设置每一个优化对于函数的优化有效性;
4、在函数优化map表中记录三元组<优化前函数ir的哈希值,优化后函数ir的哈希值,优化有效性>;
5、第二次编译时,计算当前函数执行当前优化前的哈希值;
6、根据当前函数和当前优化,在所述函数优化map表中查找,将查找到的当前函数执行当前优化前的函数ir的哈希值与第二次编译时计算出的当前函数执行当前优化前的哈希值进行比较;
7、根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化。
8、在上述技术方案的基础上,本专利技术还可以进行如下改进。
9、可选的,所述根据每一个函数执行每一个优化前后函数ir的哈希值是否发生变化,设置每一个优化对于函数的优化有效性,包括:
10、若任一个函数执行任一个优化前后函数ir的哈希值发生变化,则所述任一个优化对于所述任一个函数的优化有效,将优化有效性设置为1,否则,优化无效,将优化有效性设置为0。
11、可选的,将所述函数优化map表作为一个隐藏文件存放在源码目录中供下次编译时使用。
12、可选的,还包括根据两个优化是否相邻,对函数优化map表进行优化存储。其中:
13、若两个优化相邻,对于同一个函数,将上一个优化后的函数ir的哈希值作为本次优化前的函数ir的哈希值,且本次优化前的函数ir的哈希值用last表示,表明与上一次优化后的函数ir的哈希值相同;
14、若两个优化不相邻,则需要分别计算两次优化前后的函数ir的哈希值;
15、当同一个优化前后的函数ir的哈希值不变,则优化后的函数ir的哈希值用same表示,表明优化前后的函数ir的哈希值相同。
16、可选的,所述根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化,包括:
17、若查找到的当前函数执行当前优化前的函数ir的哈希值与第二次编译时计算出的当前函数执行当前优化前的哈希值不相同,或者若查找到的当前函数执行当前优化前的函数ir的哈希值与第二次编译时计算出的当前函数执行当前优化前的哈希值相同,且优化有效性为1,则当前优化有效,需要执行当前优化;否则,当前优化无效,不需要执行当前优化。
18、可选的,所述根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化,之后还包括:
19、当需要执行当前优化时,待当前优化执行完毕后,计算优化执行完毕后当前函数ir的哈希值,并根据当前优化前后的函数ir的哈希值是否发生变化,设置优化有效性;
20、基于当前优化前后的函数ir的哈希值和优化有效性更新函数优化map表。
21、本专利技术提供的一种编译器性能优化方法,第一次编译时,记录程序代码中每一个函数执行每一个优化前后函数ir的哈希值,并记录优化有效性;将优化前后的函数ir的哈希值和优化有效性记录在函数优化map表中;第二次编译时,计算当前函数执行当前优化前的哈希值;在函数优化map表中查找,将查找到的当前函数执行当前优化前的函数ir的哈希值与第二次编译时计算出的当前函数执行当前优化前的哈希值进行比较;根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化。本专利技术方法通过建立首次编译的函数优化有效性表来指导第二次编译,尽可能减少冗余优化,缩短第二次编译所需时间。
本文档来自技高网...【技术保护点】
1.一种编译器性能优化方法,其特征在于,包括:
2.根据权利要求1所述的编译器性能优化方法,其特征在于,所述根据每一个函数执行每一个优化前后函数IR的哈希值是否发生变化,设置每一个优化对于函数的优化有效性,包括:
3.根据权利要求1所述的编译器性能优化方法,其特征在于,将所述函数优化map表作为一个隐藏文件存放在源码目录中供下次编译时使用。
4.根据权利要求1所述的编译器性能优化方法,其特征在于,还包括根据两个优化是否相邻,对函数优化map表进行优化存储,其中:
5.根据权利要求1所述的编译器性能优化方法,其特征在于,所述根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化,包括:
6.根据权利要求1所述的编译器性能优化方法,其特征在于,所述根据比较结果和在函数优化map表中查找到的当前优化对于当前函数的优化有效性的值,确定是否需要执行当前优化,之后还包括:
【技术特征摘要】
1.一种编译器性能优化方法,其特征在于,包括:
2.根据权利要求1所述的编译器性能优化方法,其特征在于,所述根据每一个函数执行每一个优化前后函数ir的哈希值是否发生变化,设置每一个优化对于函数的优化有效性,包括:
3.根据权利要求1所述的编译器性能优化方法,其特征在于,将所述函数优化map表作为一个隐藏文件存放在源码目录中供下次编译时使用。
4.根据权利要求1所述的编译器性能优化方法,其特征在于,还包...
【专利技术属性】
技术研发人员:张抗,许世文,吴正豪,彭获然,
申请(专利权)人:武汉凌久微电子有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。