没有合适的资源?快使用搜索试试~ 我知道了~
基于SSA的移动代码在Java的即时编译中的性能优势
理论计算机科学电子笔记141(2005)103-119www.elsevier.com/locate/entcs量化基于SSA的移动代码的Wolfram Amme1InstitutfurInforormatikFriedrich-Schiller-Universit?t耶拿德国耶拿Je Escheriche von Ronne2 Michael Franz3加州大学欧文分校信息与计算机科学美国摘要Java的高性能即时编译器需要在实际的代码生成开始之前投入大量的资源。这在一定程度上是由于Java虚拟机的本质,它不能很好地满足优化代码生成器的要求。基于静态单一分配形式的替代传输格式理论上应该优于虚拟机,但这种说法以前没有在实践中得到验证。 本文重新审视了这个话题,并试图量化使用基于SSA的移动代码表示(IR),而不是基于虚拟机的效果。为此,我们将对可验证的基于SSA的IR的全面支持集成到Jikes RVM中,Jikes RVM是一个现有的Java执行环境。由此产生的系统能够加载和执行以任何一种格式表示的Java程序,传统的JVM字节码以及基于SSA的表示,它甚至可以执行由两种格式的混合组成的程序。在我们的实现中,两个可选的即时编译管道共享一个公共的低级代码生成器。性能结果是令人鼓舞的,并显示相对于Jikes RVM的JVM类文件标准优化编译器,编译时间和代码质量都有同步改进。 他们支持这样的假设,即基于SSA的中间表示在即时编译的上下文中具有更大的优势。保留字:虚拟机,单一静态赋值形式,SafeTSA1571-0661 © 2005由Elsevier B. V.出版,CC BY-NC-ND许可下开放获取。doi:10.1016/j.entcs.2005.02.046104W. Amme等人理论计算机科学电子笔记141(2005)1031引言在2001年,我们描述了SafeTSA,一种基于静态单赋值(SSA)形式的Java类型和引用安全表示[3]。SafeTSA被明确设计为取代Java虚拟机字节码语言(JVML),并认为这种基于SSA的表示在发布移动代码时,特别是在最终的即时(JIT)编译环境中,应该比基于虚拟机的格式提供显着的优势。然而,论文中提出的基准测试只与结果表示的大小(比JVML更密集)有关,而与JIT编译或执行性能无关。在本文中,我们报告了我们如何采用SafeTSA格式并将其集成到IBM其结果是一个Java执行环境,能够处理Java类文件和SafeTSA文件互换。它甚至可以执行一些类已经编译成Java类文件和其他SafeTSA文件的程序,然后在动态加载过程中将所有这些文件组合在一起。在尝试量化JVML与SafeTSA在JIT编译的上下文中(以及通过扩展,基于堆栈与基于SSA的移动代码中间表示的相对优点),我们将一系列基准程序编译为Java类文件和SafeTSA文件。然后,这些被用作JikesRVM的标准JVML优化编译器和SafeTSA编译器的输入,允许直接比较两个编译器所需的相应代码生成时间以及生成的本机代码的性能。在这些测量的基础上,我们评估基于SSA的中间表示格式是否可以作为JVML的可行替代品在下面的部分中,我们首先介绍SafeTSA格式的一些关键功能。然后,我们简要介绍了Jikes RVM系统,特别是它的代码生成器和内部数据结构。在此之后,我们描述了我们的SafeTSA编译器的实现及其集成到Jikes RVM系统。接下来是对基准测试结果的讨论,报告代码生成时间和生成代码的性能。最后,对全文进行了总结,并对今后的工作进行了展望。1电子邮件:amme@informatik.uni-jena.de2 电子邮件地址:jronne@ics.uci.edu3 电子邮件地址:franz@uci.eduW. Amme等人理论计算机科学电子笔记141(2005)103105头φ-输入i 0:int1:int加入condb0:bool身体i3:= add-int i1:inti1:int i4:= inc-inti2:intφ-input i3:inti4:intB锁i5:= getfield A.f2B锁返回b0:bool方法-输入 :fooi1:=φ-int i2:=φ-int公共类A{intf1;intf2;}公共类B{静态在Foo(A) (a)int sum = a . f 1;int我 = 1;而(i) <10){sum += sum ;i ++;}返回总和 ∗a. f 2;}}Fig. 1. 实例程序及其在SafeTSA中的表示2 SafeTSA代表SafeTSA4是一种中间表示,旨在独立于目标机器,易于验证,易于转换为优化的本机代码。SafeTSA通过几个关键特性的新颖组合实现了这一点:嵌入式控制结构树,SSA形式的指令,基于支配者的引用完整性,通过类型分离实现的类型安全,扩展以支持键优化的类型系统,以及精心选择的指令集。图1包含从图中给出的源程序生成的SafeTSA文件的图形表示。这将在下面讨论SafeTSASafeTSA不允许这个控制结构树可以被看作是图1中的方框和连接线;作为第一个近似,控制结构树可以被认为是一个方法的抽象语法树,它的表达式被删除了控制结构树的使用将SafeTSA方法的控制流程图限制 这简化了特定于机器的代码生成和优化SafeTSA这个名字代表安全类型单一静态分配表格,早于美国运输安全管理局的成立。sA0:= nullcheck Aarg0:A i0:= getfieldA.f1 sA0:sAB锁当b0:= lt-int i2:inti0:intB锁106W. Amme等人理论计算机科学电子笔记141(2005)103以及支配树推导[7]。静态单赋值形式[6]是优化编译器的标准表示。SafeTSA基于SSA表单,在JIT编译阶段利用其优势,但将生产SSA表单的成本转移到生产线上。SSA形式的关键特征是,在程序的SSA表示中使用的每个“变量”都在表示中的单个位置定义。在图1中可以看到,这是每条指令左侧的唯一变量。为了处理控制流中不同点上的值的合并点,SSA提供了特殊的φ函数,它在运行时基于执行到达包含φ函数的连接节点的CFG边在可选输入变量中进行选择。 从图1中可以看出,SafeTSA在每个位置都有一个单独的正确的SSA程序表示的一个重要属性是,对于所有指令A和B,如果A使用B的结果变量,则A必须被B支配。[5]引用完整性是SSA程序中所有变量在用于通过CFG的所有可能路径序列化的SafeTSA编码通过引用输入变量静态地强制此属性使用相对寻址方案的操作[3]。因为这种相对寻址对于每条指令都是变化的,所以图1中没有描述。SafeTSA通过类型分离和显式强制转换操作简化了类型检查。面向对象的源语言通常允许在使用父类型的任何地方使用子类型相反,SafeTSA为每种类型的变量维护一个单独的名称空间:每个定义结果变量的操作都将该变量定义为特定类型,并且每个使用变量的操作只能引用正确输入类型的变量类型分离在图1中描述为SSA输出变量的命名约定,以及如果必须将子类型用作类型,则通过将子类型变量作为输入并将类型作为其输出变量的指令将显式强制转换放置在程序表示中。如果在JIT编译器处理该方法时,5对于φ-指令,输入变量的使用被认为发生在每个指令在CFG中的join节点之前的块。然而,由φ指令定义的输出变量被认为出现在其连接节点的顶部。在SafeTSA中,这是通过在连接节点处与φ分离的φ-输入来实现的W. Amme等人理论计算机科学电子笔记141(2005)103107被验证为总是正确的(通过咨询虚拟机的类结构),则它将不产生可执行代码,但是如果不能保证正确性(例如,从类型到子类型的转换),则需要进行动态检查。SSA形式和语法类型分离的这种组合验证起来很简单,但是它与引用完整性一起,取代了Java字节码验证所需的复杂的基于堆栈的类型推断。SafeTSA的类型系统在其核心上与Java和Java字节码的类型系统相同。它允许在垃圾收集虚拟机的堆中有相同类型的对象,并且SSA变量类型可以是任何Java原语类型(int,pseudoat等)。 或引用类型,仅限于一个特定的类类型,一个特定的接口类型,或者一个特定的数组类型。但是SafeTSA类型的系统也已经扩展到支持优化。特别是,对于每个Java引用类型,SafeTSA都添加了一个只能由空检查操作产生的“安全”引用类型。所有作用于堆对象的操作都需要空检查的“安全”引用类型作为输入。因此,空检查可以安全地与使用空检查引用的访问分离在图1中可以看到一个这样的例子,其中第一个get字段需要一个空检查来将参数从类型'A'转换为'sA',但第二个可以使用'sA0'变量,这是已知安全的。类似地,添加单独的类型来表示边界检查数组元素地址计算的结果。安全引用和数组元素类型的引入允许在执行简单的公共子表达式消除时消除冗余的null和索引检查[2]。虽然SSA表示SafeTSA指令集可以分为两大类。第一个类包含那些功能性的操作(即,采用零个或多个输入并仅基于这些输入产生输出);这包括原始计算(例如,integer add)、强制转换和检查;这些指令的结果完全由SSA模型捕获。第二类指令包含可以以其他方式改变虚拟机的那些指令(例如,通过修改垃圾收集堆空间)。这个类包括字段和数组操作,以及方法和构造函数调用。图1中的get字段是第二类的一个例子。这些操作严格遵循其JVML对应项的语义,并强制执行相同的类型和内存安全不变量。108W. Amme等人理论计算机科学电子笔记141(2005)103LIRTransformer/优化器LIRTransformerTransformer/优化器SafeTSA−方法字节码−方法HSTTransformer/优化器Transformer/优化器HIR LSTMIR汇编程序二进制代码图二. 在Jikes RVM3 Jikes RVMJikes RVM是IBM Research [4]开发的Java虚拟机Jikes RVM具有几个独特的功能,其中两个与这里介绍的工作特别相关:它是仅编译的(即,它没有解释器),而且它几乎完全是用Java编写的。Jikes RVM没有解释器,而是提供了多个JVML到本机代码编译器。一个是Jikes RVM也有一个Jikes RVM优化编译器的阶段通过一系列中间表示进行通信:高级中间 表 示 ( HIR ) , 低 级 中 间 表 示 ( LIR ) 和 机 器 特 定 的 中 间 表 示(MIR),如图2所示。JVML方法最初被翻译成HIR,HIR可以被认为是面向栈的JVML的面向寄存器的音译。LIR与HIR的不同之处在于某些JVML指令被Jikes RVM特定的实现替换(例如,从字段读取值的HIR指令将扩展为计算字段地址然后执行Transformer/优化器W. Amme等人理论计算机科学电子笔记141(2005)103109在该地址上加载)。从LIR到MIR的降低使程序呈现在目标指令集架构的词汇表中。最后阶段编译的一个重要步骤是从方法的MIR中生成本机机器码。根据优化编译器的配置,可以在每个IR中执行优化。由于Jikes RVM是用Java编写的,因此VM可以以Java数组的形式访问关键数据结构。其中最重要的是Jikes RVM的目录(JTOC)。JTOC是一个数组,包含(或包含对)所有全局可访问的实体(即,所有的常量、每个类型的类型信息块(TIB)、静态字段和方法的元对象等都可以在JTOC中作为索引找到)。加载类包括实例化适当的TIB和元对象,并将它们添加到JTOC或类方法在第一次被调用时被编译。当编译器发现对尚未加载的字段或方法的引用时,它会在第一次使用该字段或方法之前包含解析该字段或方法的代码。Jikes RVM通过维护两个对象集表,对象集TableField和对象集TableMethod,促进了动态类加载。在这些表格中,每一个已知的领域和方法都有一个条目。当需要解析字段或方法时,访问相应的条目。 如果它是有效的,则使用操作集来计算地址。如果无效,则将调用类加载器加载适当的类,并将有效的对象集写入适当的对象集表。Jikes RVM系统的另一个特征是空检查指令,其在Jikes RVM的优化编译器的中间表示中是显式的 为了减少必须在运行时执行的空检查指令的数量,所谓的空检查组合器在MIR的生成期间针对每个空检查指令检查该指令是否可以被消除并与直接跟随的加载或存储指令组合。以这种方式消除了显式空检查指令的引用在存储器访问时仍将被空检查,因为执行具有基址空的加载或存储指令将引发由Jikes RVM系统捕获的硬件中断。4集成SafeTSA通过将SafeTSA类加载和SafeTSA编译器集成到Jikes RVM系统中,我们构建了一个可以执行SafeTSA和JVML编译的Java程序的VM。因此,在功能上,110W. Amme等人理论计算机科学电子笔记141(2005)103B锁头加入φ-输入i 0:int1:intcondb0:bool身体B锁B锁ti3:= resolve ti1:int21244:int i5:= int loadA0:A ti3:int A.f2i6:= mul-i3:= add-int i1:inti1:int i4:= inc-inti2:intφ-input i3:inti4:int返回b0:bool当A0:=空检查A arg0:Ati1:= o设置加载JTOC 21228:intti2:= resolve ti1:int 21240:inti0:= int load A0:A ti2:int A.f1方法-输入 :fooi1:=φ-int i2:=φ-intB锁b0:= lt-int i2:inti0:int(a) 高水平安全TSA(b)低水平安全TSA图三. 方法foo()的HST和LST表示。整个程序已经编译到SafeTSA,或者它作为JVML类文件存在,或者如果程序作为SafeTSA和JVML类的异构混合提供。关于动态类加载,修改后的Jikes RVM系统以类似于传统JVML类的方式处理SafeTSA类。这是通过修改类加载器来实现的,这样每当它加载一个新类时,它都会检查SafeTSA类的类文件存储库当修改后的类加载器找到SafeTSA文件时,它将加载SafeTSA文件并设置必要的JTOC和TIB条目;从SafeTSA文件加载的类的方法调用导致SafeTSA编译器被调用以产生可执行代码。如果不存在SafeTSA文件,类加载器只加载适当的Java类文件,对JVML类的任何方法调用都将导致调用标准JVML优化编译器来编译方法。图2显示了我们的SafeTSA编译器的内部结构最初,编译器将方法转换为它的高级SafeTSA表示(HST)。SafeTSA方法的HST表示是一种中间表示,它在很大程度上独立于主机运行时环境,但与原始SafeTSA方法的不同之处在于,sA0:=空检查A arg0:Ai0:=获取未解析的 A. f1 sA0:sAB锁头φ-输入i 0:int1:int加入condb0:bool身体B锁φ-input i3:inti4:intB锁i5:=获取字段未解析 A.f2 sA 0:sAi6:= mul-int i1:int i5:int返回b0:bool方法-输入 :fooi3:= add-int i1:inti1:int i4:= inc-inti2:inti1:=φ-int i2:=φ-int当B锁b0:= lt-int i2:inti0:intW. Amme等人理论计算机科学电子笔记141(2005)103111访问字段和方法。接下来,将SafeTSA方法从HST转换为低级SafeTSA表示(LST)。此过程将一些HST指令扩展为主机JVM特定的LST操作,专门用于Jikes RVM的对象布局和参数传递机制。在此转换之后,LST方法被优化并转换为Jikes RVM的JVML优化编译器所使用的相同LIR。JVML编译器Java的动态类加载的一个后果在这种情况下,JIT编译器将无法在编译时解析JIT编译器不是直接访问数据结构,而是必须插入特殊的SafeTSA编译器在创建HST IR期间插入这些解析指令。事实上,这是序 列 化 的 SafeTSA 表 示 和 HST 之 间 的 主 要 区 别 : 一 个 get fieldunresolved set field unresolved或call unresolved将被替换为SafeTSA表示的每个get field/ set field或call指令,这些指令对尚未加载的类进行操作图3(a)显示了如果在foo编译之前没有加载类A,那么foo方法的HST会是什么样子这一点可以从现场未解决的指令中得到证明。一旦该方法处于HST中,就可以通过将某些高级指令扩展到JikesRVM特定的实现来将其降低到LST。大多数情况下,这包括使用JikesRVM的JTOC和TIB中的o对象集执行地址计算。它还涉及将SafeTSA检查和强制转换操作转换为Jikes RVM等效操作,具体化常量操作数,并将高级存储访问转换为低级加载和存储指令。图3显示了将从示例程序创建的优化LST。在LST中,安全类型已被转换回正常的Jikes RVM类型,并且高级get field未解析指令已被降低为执行解析并访问该字段的指令序列:一个o_set加载指令传递o_set表的地址O_setTableField。resolve指令检查是否尝试根据field的field字典索引加载操作集(在示例程序中,a.f1的field字典条目为21240,a.f2的field字典条目为21244)。一旦确定了操作集,就使用最终的低级别内部加载指令来实际加载字段。由于公共子表达式的消除,第二个get字段未解析在转换为LST时不需要一个操作集加载指令。从LST到LIR的转换是SafeTSA编译器的最后阶段112W. Amme等人理论计算机科学电子笔记141(2005)1031 标签0 16标签72 序言l0pi(A,x,d)= 17 int add t6i(int)= t6i(int),t6i(int)3 LABEL1 18 int add t7i(int)= t7i(int),14 空值检查t2v = l0pi(A,x,d)19 LABEL65 int load t3i([I]= JTOC(int),21228 20 int ifcmp t10v = t7i(int),10,,LABEL76 LABEL3 21 LABEL87 int load t4i(int)= t3i([I]),21240 22 int load t4i(int)= t3i([I]),212448 public int findDuplicate(int i,int j)=,LABEL2 23 int ifcmp t4i(int),0,!=,标签10 9标签4 24标签910 解析A.f1 25解析A.f211 goto LABEL3 26 goto LABEL812 标签2 27标签1013 int load t6i(int)= l0pi(A,x,d),t4i(int),A.f1,t2v 28 int load t11i(int)= l0pi(A,x,d),t4i(int),A.f1,t2v 14 int move t7i(int)= 1 29 int mul t12i(int)= t6i(int),t11i(int)15 goto LABEL6 30 return t12i(int)见图4。 方法foo()的LIR表示。它由三个主要任务组成:将控制结构树转换成分支指令,将LST指令直接转换成LIR指令,以及将SSA变量转换成LIR的虚拟寄存器。图4显示了翻译成LIR的示例程序,它由9个基本块组成。指令5-在SSA值到虚拟寄存器的转换过程中,每个φ函数通常必须转换为每个φ函数的φ输入处的移动此移动将相应φ输入操作数的内容转移到对应于φ指令的结果寄存器中。因此,通常情况下,当为方法foo生成LIR时,需要在中间表示中插入四条移动指令(两条指令位于while循环之前的块的末尾,两条指令位于表示循环体的块的末尾)。然而,φ函数的简单解析通常会产生比所需更多的移动,因为更复杂的解析可以将某些φ指令的虚拟寄存器与它们的一个或两个输入寄存器合并。为了减少必须插入到LIR中的移动指令的数量,可以指示SafeTSA编译器执行φ-move优化。在这样做时,SafeTSA编译器在每次插入移动指令之前检查目标寄存器是否可以与指令的源寄存器合并。如果目标和源寄存器的合并是可行的,则两个寄存器将合并为单个寄存器,而不是将移动指令插入到LIR中。如图4的LIR所示,插入到示例程序中的移动指令的数量可以通过使用这种φ-移动优化减少到一个W. Amme等人理论计算机科学电子笔记141(2005)103113名称描述大小(字节)第2隐窝IDEA加密19875堆排序非线性分类7535LUFactLU分解18000SOR超松弛2541SparseMat稀疏矩阵乘法6269第3欧拉计算流体力学38320莫尔丁分子动力学模拟14921Montecarlo蒙特卡罗模拟117445RayTracer3D光线追踪器40173搜索Alpha-Beta剪枝搜索21582表1.基准方案JVMLSSPSSSPSSLPsSCLPSSun JavacSafeTSAGGGGGGG公用子表达式消除常数传播GGGGGGGφ-移动优化GGGG表2移动代码优化和优化5结果SafeTSA为优化代码的安全传输提供了一种机制,但为了凭经验评估SafeTSA是否提供了预期的性能优势,我们通过Jikes RVM系统运行了一系列基准测试,其中我们比较了编译为JVML和SafeTSA的程序的执行时间和所需编译时间。6所有结果在下面讨论-通过运行第2Java Grande Forum Sequential Benchmarks(JGF)[8]。之所以选择JavaGrande Benchmarks,是因为它们可以免费获得源代码,并且似乎适合测量编译时间和生成代码的性能。表1列出了这些基准程序,并提供了简短的描述及其程序大小。表2显示了在6所有报告的执行时间还包括JIT编译基准程序方法所需的时间114W. Amme等人理论计算机科学电子笔记141(2005)103基准以秒为单位的JVMLSafeTSA(SP)Δ%SafeTSA(SPS)Δ %隐窝5.4985.370-2.335.392-1.93堆排序3.0843.063-0.683.051-1.07LUFact3.3203.247-2.203.232-2.65SOR10.42010.388-0.3610.377-0.47SparseMat23.26623.040-0.9723.019-1.06欧拉59.67158.132-2.5858.154-2.54莫尔丁14.78514.642-0.9714.641-0.97Montecarlo38.17537.580-1.5637.287-2.33RayTracer55.93256.5971.1956.4760.97搜索20.06720.3221.2720.3241.28表3执行时间:JVML与SafeTSA基准测试。JVML用于表示使用版本号生成的Java类文件1.2.2 Sun javac。在将Java源代码编译为SafeTSA格式的过程中,SafeTSA文件的生成启用了各种优化。此外,在某些情况下,在LIR代码的生成过程中使用φ-移动优化。在下面的讨论中,我们将把使用恒定传播(SP)生成的SafeTSA文件作为“基线”SafeTSA文件所有结果均在具有733 MHz PowerPC G4处理器的PowerMac上获得,该处理器运行Mandrake Linux 7.1。该系统有1.5 GB的主内存和256 KB的二级缓存。我们用于测量的Jikes RVM 系统是使用FullOptNoGC 选项(即,包含Jikes RVM JVM的bootimage本身是由Jikes RVM优化编译器生成的,所有JVM类都包含在bootimage中)。为了从一次运行到下一次运行获得稳定的结果,我们禁用了垃圾收集并在单用户模式下运行系统。我们多次运行每个基准测试并取得最佳结果,但在这种稳定的配置中,所有的整体执行时间变化都小于0.005秒,并且在大多数情况下,变化小于我们可以测量的。在基准测试中,我们主要感兴趣的是检查JVML和SafeTSA的高级设计在用作JIT编译的中间表示时的相对因此,所有测量都是在优化级别0下运行SafeTSA编译器和Jikes RVM的优化字节码编译器进行的使用此优化时W. Amme等人理论计算机科学电子笔记141(2005)103115图五. 静态优化对执行时间级别,SafeTSA编译器支持除了φ-move优化之外不使用其他优化,JikesRVM的字节码编译器只执行精确字节码编译所需的优化。因为SafeTSA编译器还不支持JVML和SafeTSA方法之间的内联,所以我们全局禁用了方法调用的内联表3比较了使用Jikes RVM的JVML JIT编译的基准程序的执行时间(以秒为单位)与使用基线SafeTSA文件作为SafeTSA编译器的输入时可以实现的运行时间。无论有无φ-move优化,基于SafeTSA的版本在10个基准测试中的8个中都优于JVML版本。乍一看,性能提升(运行时间减少0.36%到2.58%)似乎并不令人印象深刻,但应该注意的是,基线SafeTSA文件与JVML文件的区别仅仅在于不存在对局部变量的赋值如表3的结果所示,在大多数情况下,φ-move优化减少了执行时间,但只是适度的。然而,我们使用JGF顺序基准测试第1节中的简单程序进行的比较研究表明,在某些情况下,程序的运行时间可以得到改善当执行φ-move优化时,最高可达8%。为了确定静态执行的提前优化对基准程序执行时间的影响,生成了不同优化的SafeTSA文件,随后在执行时间方面进行了比较。图5描述了不同SafeTSA版本(SS、SPS、SLPS和SCLPS)相对于执行时间的变化(%)116W. Amme等人理论计算机科学电子笔记141(2005)103基准指令空检查索引检查之前后Δ%之前后Δ%之前后Δ%隐窝721681-5.558663-26.748181±0堆排序194185-4.642424±02121±0LUFact848770-9.209469-26.609681-15.63SOR181165-8.842315-34.782322-4.35SparseMat237231-2.532928-3.453232±0欧拉72966698-8.2016661422-14.6512301103-10.33莫尔丁13021293-0.69108108±04949±0Montecarlo18781773-5.59181140-22.655046-8.01RayTracer13401177-12.16203121-40.391414±0搜索15801486-5.9511199-10.81283274-3.18表4指令数、空值检查和边界检查运行时,可以实现在其基于JVML的相互作用的执行。测量结果表明,常数传播和死代码消除往往会导致相当小的运行时改进。此外,在某些情况下,这些优化的应用程序可能会导致性能下降,这可能是由于减少程序的局部性。然而,除了一个基准测试程序之外,公共子表达式消除的应用始终导致相当大的性能增益。总的来说,所有三种优化产生的SafeTSA文件在只有一个基准程序中未能超过JVML对应文件。在所有其他情况下,完全优化的SafeTSA文件有时可以认为优于JVML文件,对于三个基准程序,SafeTSA文件的执行时间比JVML文件所需的时间少9%以上。为了更好地理解我们在优化的SafeTSA中观察到的运行时结果,我们进行了进一步的调查,以确定哪种子表达式消除是实现性能增益的原因表4显示了在三个优化阶段可以从SafeTSA文件中消除的空检查和边界检查的数量。如表所示,7%的指令、17%的空值检查和8%的边界检查可以从程序中消除。对程序源代码的进一步审查表明,消除超级边界检查是导致优化的SafeTSA文件的运行时行为得到改善的主要原因。例如,在基准测试程序LUFact和Euler中分别消除了15.63%和10.33%的边界检查,从而缩短了相比之下,Moldyn基准测试的执行时间减少了9.98%,这是由于消除了内部必须执行多次的不必要的浮动点操作W. Amme等人理论计算机科学电子笔记141(2005)103117见图6。 总编译时间(相对)一个循环尽管从SafeTSA生成的目标代码通常比它的JVML对应代码更好,但两种编译器的测量编译时间表明,在大多数情况下,SafeTSA编译比基于JVML的编译需要更少的时间。对于我们的基准测试,编译时间只占总执行时间的1-4%。最长的编译时间是Euler的JVM字节码编译器所需的1.6秒(它也有最长的总执行时间59.67秒);所有其他基准测试的编译时间都小于0.3秒。图6包含了所有基准测试程序的不同优化的SafeTSA文件相对于基于JVM的编译的编译时间。对于基线SafeTSA,编译速度比JVML快27%,完全优化的SafeTSA编译速度快35%。完全优化的SafeTSA的编译时间减少可以通过优化的SafeTSA文件的程序大小减少6总结和今后的工作我们已经描述了将SafeTSA支持集成到Jikes RVM中,Jikes RVM是一个先进的动态优化系统,创建了一个完整的运行时环境,支持SafeTSA和JVML 类 文 件 的 异 构 混 合 。 我 们 使 用 这 个 系 统 来 运 行 Java GrandeBenchmarks,试图评估编译时间的变化(%)118W. Amme等人理论计算机科学电子笔记141(2005)103SafeTSA与JVML作为JIT编译器输入的相对优点。这些基准测试运行的结果表明,SafeTSA可以用更短的编译时间生成性能更好的本机代码还应该指出的是,这些数字不包括验证时间,因为Jikes RVM 2.2.0不验证类文件。SafeTSA验证比JVML验证简单得多,因此将验证包括在从下载到执行所需的总时间中将使平衡进一步向SafeTSA倾斜虽然到目前为止的结果令人印象深刻,但它们仍然是初步的,很可能没有充分代表SafeTSA的好处目前改进编译器的计划包括编写一个SSA感知寄存器分配器和最终机器码生成器,这将利用Jikes RVM的LST也是SSA形式的事实我们还计划研究将程序注释纳入基于SSA的表示中的可能性,这将提高代码质量和/或减少编译时间,同时仍然保持安全性。确认我们要感谢Ferm 'ın Reig、Andreas Hartmann、Ning Wang和各种匿名评审对本文早期版本的评论我们还要感谢所有以某种方式为SafeTSA项目做出贡献的人,特别是Philipp Adler、Alexander Apel、HartmutArlt、NiallDalton、Andr easHart mann、Tho masH ein ze、TimoMai、AndreMo¨ller、Jan Peterson、Prashant Saraswat和Ning Wang。此外,我们还要感谢Michael Hind和IBM Research和其他地方的Jikes Research虚拟机的其他贡献者。本研究部分得到了德国研究协会(DFG)(资助AM-150/1-1和AM-150/1-3)、国家科学基金会(NSF)(资助CCR-9901689)以及国防高级研究计划局(DARPA)和空军研究实验室(AFRL)(协议号F30602-99-1-0536)的支持。引用[1] Alpern , B. , C. R. Attanasio , J. J. Barton , M. G. Burke , P. Cheng , J.- D. Choi , A.Cocchi,S. J. Fink,D. Grove,M. Hind,S. F. Hummel,D. Lieber,V. Litvinov,M. F.Mergen,T. Ngo,J. R.作者:Russell,V. J.塞拉诺,J. C。Shepherd,S. E.史密斯,V.C.Sreedhar , H. Srinivasan 和 J.Whaley,TheJalapenvirtualmachine, IBMSystemsJou r nal39(2000),pp. 211-238[2] Amme,W.,N. Dalton,M. Franz和J. von Ronne,A typed-safe mobile code representationaimed at supporting dynamic optimization at the target side,in:Proceedings of the 3rd ACMWorkshop on Feedback-Directed and Dynamic Optimization(FDDO-3), Monterey ,CA,2000,pp. 61比70W. Amme等人理论计算机科学电子笔记141(2005)103119[3] Amme,W.,N. Dalton,J. von Ronne和M. Franz,SafeTSA:基于静态单赋值形式的类型安全和引用安全的移动代码表示,在:ACM SIGPLAN 2001编程语言设计和实现会议(PLDI 2001)(2001),pp. 137比147[4] 阿 诺 德 , M. , S. 芬 克 , D 。 Grove , M. 欣 德 和 P.F. Sweeney , Adaptive optimization in theJalapeno JVM , in : Proceedings of the 15th ACM SIGPLAN Conference on Object-OrientedProgramming,Systems,Languages,and Applications(OOPSLA47比65[5] 伯克,M。G.,J. - D. 崔,S。芬克,D。Grove,M.欣德Sarkar,M.J. 塞拉诺河谷C. 斯里达尔,H. Srinivasa n and J. Whaley,Thejalapenodynamicoptimizingcompilerforjava,in:Prooceedingsof the ACM 1999 conference on Java Grande(Java 99)(1999),pp.第129-141页。[6] 塞隆河,J. Ferrante,B. K.罗森,M。N. Wegman和F. K. Zadeck,E. C. C.计算静态单赋值形式和控制依赖图,ACM程序设计语言与系统学报(TOPLAS)13(1991),pp.451-490[7] Hecht,M.S. 和j.D. 吴晓刚,可约图的性质,北京:计算机科学出版社,200121(1974),pp. 367-375.[8] 马修,J. A.,P. D. Coddington和K. A. Hawick,Java Grande Benchmarks的分析和开发,在:Proceedings of the ACM 1999 Java Grande Conference(Java 1999)(1999),pp. 72-80.
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Aspose资源包:转PDF无水印学习工具
- Go语言控制台输入输出操作教程
- 红外遥控报警器原理及应用详解下载
- 控制卷筒纸侧面位置的先进装置技术解析
- 易语言加解密例程源码详解与实践
- SpringMVC客户管理系统:Hibernate与Bootstrap集成实践
- 深入理解JavaScript Set与WeakSet的使用
- 深入解析接收存储及发送装置的广播技术方法
- zyString模块1.0源码公开-易语言编程利器
- Android记分板UI设计:SimpleScoreboard的简洁与高效
- 量子网格列设置存储组件:开源解决方案
- 全面技术源码合集:CcVita Php Check v1.1
- 中军创易语言抢购软件:付款功能解析
- Python手动实现图像滤波教程
- MATLAB源代码实现基于DFT的量子传输分析
- 开源程序Hukoch.exe:简化食谱管理与导入功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功