CN105493041B - 在访问动态类型化对象过程中的并发内联高速缓存优化 - Google Patents
在访问动态类型化对象过程中的并发内联高速缓存优化 Download PDFInfo
- Publication number
- CN105493041B CN105493041B CN201480047215.7A CN201480047215A CN105493041B CN 105493041 B CN105493041 B CN 105493041B CN 201480047215 A CN201480047215 A CN 201480047215A CN 105493041 B CN105493041 B CN 105493041B
- Authority
- CN
- China
- Prior art keywords
- code
- inline
- concurrent
- path
- serial
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4443—Inlining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
- G06F9/4491—Optimising based on receiver type
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
- G06F9/4552—Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45529—Embedded in an application, e.g. JavaScript in a Web browser
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/62—Details of cache specific to multiprocessor cache arrangements
- G06F2212/621—Coherency control relating to peripheral accessing, e.g. from DMA or I/O device
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/451—Execution arrangements for user interfaces
Abstract
本发明描述了用于基于内联高速缓存代码来并发访问动态类型对象的方法和装置。单个线程中的内联高速缓存初始化可被卸载到解译器,而不会造成不必要的同步开销。可提供线程偏置机制来检测代码块是否在单个线程中执行。此外,可减少经由编译器诸如基线JIT编译器执行的内联高速缓存初始化的次数,以提高处理性能。
Description
相关申请的交叉引用
本专利申请涉及并要求于2013年8月30日由Filip Pizlo等人提交的名称为“RUNTIME ACCESS OF DYNAMIC OBJECTS”的美国临时专利申请61/872,386的权益,该专利申请以引用方式全文并入本文。
技术领域
本发明通常涉及针对动态类型化数据的运行时访问。更具体地,本发明涉及对内联高速缓存代码进行优化以并发执行基于动态语言的代码。
背景技术
动态语言诸如JavaScript、Ruby、Python、Perl和PHP等正日益被认为是静态语言诸如C和C++的替代。动态语言带来很多益处,诸如程序员生产率和相对浅的学习曲线。然而,进一步采用包括JavaScript、Ruby、Python和其他语言的动态语言的障碍是缺少高性能共享存储器并发机制,诸如在静态语言中明显可用的线程和锁定或libdispatch。由于对象在动态语言中的工作方式,这一问题被认为是困难的,所以至今还未解决。
先前为解决该问题所作的尝试包括围绕每个对象访问添加锁定机制。尽管锁定机制可保证期望的并发语义,但是非常慢。锁定和解锁可按照低于正常堆访问的量级来执行,因此引入过高的开销。
另外,内联高速缓存(IC)通常用于基于JavaScript的代码的高性能具体实施。典型地,内联高速缓存包括自修改代码。然而,可在多个处理器上执行的并发自修改代码可能既困难又慢。因此,向用于基于JavaScript的代码的基于内联高速缓存的具体实施添加并发性可能造成不切实际的昂贵。
此外,JavaScript作为语言允许在已构造对象之后向那些对象添加元素。如果基于JavaScript的程序被执行以向对象添加比可被包含在其内联属性存储装置中的更多的属性,则必须分配单独的外联存储器块以存储其附加属性。JavaScript阵列主要用于编索引的属性存储。关于对象的编索引属性的存在总是要求分配外联索引属性存储对象。
因此,用于执行基于动态语言的程序的现有具体实施往往缺乏效率、并发性和有效优化。
发明内容
从动态编程语言诸如JavaScript生成的代码可包括增强型对象模型以允许在运行时期间并发执行数据访问。除了对象的类型结构和数据有效载荷存储属性或字段值之外,索引结构可被引入到表示动态类型化对象的对象模型。索引结构的元素可作为用于访问对象的间接索引指向对应属性值处。
在一个实施例中,动态类型化程序代码(例如,实现某一算法)可被允许通过对象的索引结构经由附加间接索引来对对象的单个属性值并发执行每次访问操作而不会产生竞争状况。针对对象的单个属性值的每次访问(例如,加载/存储)操作可要求多个指令操作和/或原子操作。在并发执行期间,这些指令可被允许以非同步方式交织。
在其他实施例中,用于访问单个线程中的动态类型化对象的内联高速缓存初始化可被卸载到解译器而不会造成不必要的同步开销。可提供线程偏置机制来检测代码块是否在单个线程中执行。此外,可减少经由编译器诸如基线JIT编译器执行的内联高速缓存初始化的次数,以提高处理性能。
代码块可为编译单元、一部分源代码、一个或多个源代码文件或其他可适用代码语句集(例如,代码规范的连续部分)。编译单元可指代被编译为并且被认为是一个逻辑单元的源代码。编译单元可包括一个或多个完整的源代码文件,但是还可为专用代码部分或文件的所选择的部分。编译单元内的声明和定义可确定函数和数据对象的范围。
在其他实施例中,由多个线程中共享的代码块中的内联高速缓存初始化可被延迟或定时以减少所要求的处理器同步(例如,光点)的出现,以利用初始化来更新可执行代码。例如,每个线程可在运行时期间将初始化代码存储在缓冲器中。光点定时器(例如,经由特定线程)可使得所有内联高速缓存周期性地(例如,每10ms)初始化(例如,更新到运行时),只要缓冲器对于所要求的处理器同步来说非空即可。因此,可减少针对内联高速缓存初始化所需的昂贵或缓慢的同步操作的调用次数。
在其他实施例中,针对基于动态语言的程序可动态跟踪阵列对象是否为平面阵列类型。平面阵列类型的阵列对象的阵列元素可被存储在所分配的对象单元内的可选内联存储装置中,以表示阵列对象。对象单元中的内联存储装置可被可用存储空间限定在于存储器中分配的相邻对象单元之间。对象的平面阵列类型可基于对象是否表示阵列并且基于对象单元的内联存储装置是否具有足够的存储空间来存储阵列的元素。平面阵列类型的阵列对象可允许在对象单元中访问的阵列对象的阵列元素,而无需经由被存储在对象单元中的指针进行附加存储器加载。此外,生成支持平面阵列类型的可执行代码的编译器的类型系统可允许编译器基于平面阵列类型来执行代码优化。
通过附图并且通过以下具体描述,本发明的其他特征将显而易见。
附图说明
本发明以举例的方式进行说明,并且不限于各个附图的图形,在附图中类似的附图标号指示类似的元件,并且其中:
图1为示出了用于从网络化设备检索的基于动态语言的源代码的示例性执行运行时的网络图;
图2为示出了并发执行和/或优化执行访问动态类型化对象的系统的一个实施例的框图;
图3为示出了用于执行共享共同动态类型化对象的多个线程的一个示例性运行时的框图;
图4示出了经由并发执行而共享的动态类型化对象的示例性分配;
图5为示出了用于生成用于访问动态类型化对象的并发可执行指令的过程的一个实施例的流程图;
图6为示出了用于基于具有索引标号的对象模型来并发访问对象的属性值的过程的一个实施例的流程图;
图7A-图7B为示出了针对并发执行来优化内联高速缓存的代码块的运行时系统的框图;
图8示出了用于利用内联高速缓存代码来动态编译代码块的并发执行的示例性时间线;
图9为示出了用于自修改内联代码访问用于并发执行的动态类型化对象的过程的一个实施例的流程图;
图10为示出了用于基于具有索引标号的对象模型借助内联高速缓存并发访问对象的属性值来动态编译函数代码块的过程的一个实施例的流程图;
图11示出了针对平面阵列对象支持阵列数据存储内联的对象模型的实例;
图12为示出了用于优化动态编程语言中指定的对象数据访问的动态分配的阵列数据内联的系统的一个实施例的框图;
图13为示出了动态编译代码以分配阵列数据内联的过程的一个实施例的流程图;
图14为示出了用于在运行时期间识别平面阵列数据类型以生成指令以用于经由平面阵列分配的内联迭代地访问对象的过程的一个实施例的流程图;
图15示出了数据处理系统诸如计算机系统的一个实例,该数据处理系统可与本文所述的实施例一起使用。
具体实施方式
本文描述了用于共享动态类型化对象、优化用于访问动态类型化数据的内联高速缓存代码、优化动态类型对象中的阵列数据的方法和装置。在以下说明中示出了许多具体细节,以提供对本发明的实施例的彻底解释。然而,对于本领域的技术人员显而易见的是,本发明的实施例可在不具有这些具体细节的情况下被实施。在其他情况下,尚未详细示出熟知的部件、结构和技术,以免模糊对此说明的理解。
在本说明书中提到的“一个实施例”(“one embodiment”或“an embodiment”)是指结合实施例所述的特定特征、结构或特性可被包括在本发明的至少一个实施例中。在本说明书中的不同位置出现的短语“在一个实施例中”不一定都是指同一个实施例。
下图中示出的过程通过处理逻辑部件来执行,该处理逻辑部件包括硬件(例如,电路、专用逻辑部件等)、软件(诸如在通用计算机系统或专用机上运行的软件)、或两者的组合。虽然下文按照某些顺序操作来描述该过程,但应当理解,所述的某些操作可以不同的顺序来执行。此外,某些操作也可并行执行而并非按顺序执行。
图1为示出了用于从网络化设备检索的基于动态语言的源代码的示例性执行运行时的网络图。在一个实施例中,网络系统100可包括一个或多个服务器应用诸如在一个或多个服务器设备中托管的服务器应用101,以提供可用于在客户端设备中运行的客户端应用105的内容。例如,服务器应用101可为web服务器并且客户端应用105可为web浏览器。服务器101和客户端105可基于例如互联网络协议诸如HTTP(超文本传输协议)或其他可适用协议经由网络103彼此通信。
在一个实施例中,从服务器101检索的内容可包括基于超文本语言(诸如HTML(超文本标记语言)、XML(可扩展标记语言)或其他标记语言)的web页面,该超文本语言嵌入动态编程语言(例如JavaScript、Ruby、Python或其他动态类型化语言)中或与动态编程语言中的源进行链接(例如超链接)。客户端105可动态地下载或获取用于执行的所链接的源。在一个实施例中,客户端105可动态编译下载的源以优化代码执行以用于改善包括例如多线程执行和/或多个处理器或处理单元的并发执行环境中的性能。
图2为示出了并发执行和/或优化执行访问动态类型化对象的系统的一个实施例的框图。在一个实施例中,系统200可包括操作环境201诸如由一个或多个处理器托管的图1的操作系统托管客户端应用105。操作环境201可包括编译器205,该编译器例如基于即时编译来在运行时期间将源代码203动态和/或连续编译为可执行代码215。
源代码203可包括动态编程语言诸如JavaScript、Ruby、Python或其他可适用动态类型化语言中的程序。源代码203可不指定或声明在代码声明中标引的数据或对象的类型或形状。在一个实施例中,可通过在操作环境201中运行的浏览器应用或其他可适用应用来从远程设备诸如图1的服务器101检索源代码203。编译模块205可由浏览器应用控制以执行浏览操作。
编译器205可从源代码203生成可执行代码215。在一个实施例中,编译器205可解析源代码203来以静态或动态方式发出中间代码、字节码或其他可适用编译代码,从而执行在源代码203中指定的数据处理操作。编译器205可提供表示动态类型化对象的对象模型以启用并发执行。例如,对象模型可包括对对象值的间接引用,以允许在多个处理器环境中在多线程间或在多个执行过程间共享共同对象。
在一个实施例中,优化的内联高速缓存代码生成器模块207可发出内联高速缓存代码以用于访问(例如,读取、写入、更新等)由多执行线程共享的动态类型化对象。所发出的内联高速缓存代码可支持针对并发执行的优化运行时绑定而无需高代价的处理器指令同步。所发出的代码可包括能够在例如执行初始化内联高速缓存代码时改变其自身的指令的自修改代码。
在一个实施例中,并发代码执行模块217可调用解译器213以基于经由编译器205生成的代码来执行操作。例如,解译器213可根据经由编译器205发送的自修改指令来更新字节码,而无需激活指令高速缓存刷新来同步不同处理器间的指令。在一些实施例中,指令高速缓存刷新模块219可例如经由专用线程来周期性地调用指令高速缓存刷新。
根据某些实施例,编译器215可包括优化的阵列对象处理程序模块209,以提供能够在运行时期间识别专用类型(例如,平面阵列类型)的动态类型化数据的可执行代码,从而优化阵列数据处理。因此,经由并发代码执行模块217对阵列对象的重复或迭代处理可获取与用于利用静态类型化阵列数据类型编译的类似操作的执行指令可比拟的执行性能(例如,利用预先指定的阵列类型来优化阵列数据处理)。
并发代码执行模块217可基于可执行代码215来调用ACS(原子比较和交换)处理程序模块221一执行同步更新操作而无需依赖高成本的基于软件的锁定/解锁机制。ACS处理程序模块221可直接经由处理器硬件逻辑部件支持以确保原子更新操作在无间断的情况下执行(例如,在一个处理器指令周期内)。
在一个实施例中,程序或可执行代码中的变量的运行时值的类型可在程序(例如,可执行代码217)正运行的同时在运行时期间被识别并进行概要分析(例如,分析、概要等)。基于通过过去执行历史的识别类型,可预测运行时值的未来类型来更新或重新编译程序以代替程序或代码中的具有类型预测优势的部分。
例如,配置文件数据(例如,在运行时期间指示数据或对象的类型)可被收集到运行时数据211中。编译器205可基于配置文件数据经由重新编译来连续优化可执行代码215。配置文件代码可嵌入可执行代码215中以在运行时期间启用对配置文件数据的收集。
动态类型化对象的并发访问
在一个实施例中,可提供并发对象模型以允许并发执行在不损坏存储器堆的情况下访问(例如,读取、写入、更新等)动态类型化对象所需的多个机器指令。对象可包括一个或多个字段或属性。动态类型化对象的字段或属性可在第一次经由可执行代码分配时在运行时期间出现。与可执行代码对应的基于动态语言的源程序或代码可能不包括对象的所有字段的预先声明。对象可被表示为复杂数据结构(或形状)。对对象的每次访问可包括执行多个机器指令。
并发对象模型可包括属性索引,以允许在无需经由额外同步的协调的情况下经由从多执行(例如,在多处理器环境中)线程(或处理)交织的多个机器指令来并发访问公共对象或竞争存储器访问。对对象的访问的结果可保持一致,而与交织这些指令的次序无关。因此,并发对象模型可经由多个指令来启用原子访问,每个指令具有原子执行的单个机器指令属性。因此,并发对象模型可在不损坏堆的情况下允许竞争存储器进行访问,以并发读取、写入和更新一致且良好限定(例如,根据这些访问操作的语义)的动态类型化对象。
根据某些实施例,对象可经由单元和有效载荷来表示。单元可包含对结构和有效载荷的标引。例如,单元可包括识别结构的结构标识符和指向存储有效载荷的位置的有效载荷指针。结构可指示对象具有的字段或属性以及在有效载荷中存在的那些字段索引。在一些实施例中,结构可包括表示字段的一组属性名。有效载荷可包括那些字段的值(或属性值)。
基于并发对象模型来表示动态类型化对象的单元的示例性分配可包括:
其中Cell.Value可表示用于对象的整数或其他可适用属性值或字段值。Cell.structure可为对对象的结构的整数标引。共享Cell.structure的公共值的两个对象可指示这两个对象为相同动态类型或形状。在一个实施例中,Cell.structure可表示对表示不同类型的动态结构的表格的索引。
Cell.index可包括对对象的有效载荷或属性值的间接标引。在一个实施例中,Cell.index可提供一层间接索引以允许对象的有效载荷针对对象数据的并发访问动态生长(例如,属性值)而不会引起具有不一致数据访问结果的竞争状况。索引本身可包括经由字段偏移量索引的阵列并且在其中包含指向真实字段值(或属性值)的指针。
在一个实施例中,Cell.index可包含作为对象数据访问中的不变量的不变字段标引或值。尽管对象的字段值可改变,但是表示对象的对象单元可包括对字段值的不变标引。可在无需同步成本的情况下实现并发对象访问。
例如,可利用具有内联高速缓存优化的以下操作(例如,由编译器生成)来执行用于访问对象的典型对象读取程序声明(例如,用于读取对象o的属性f的v=o.f):
SlowPathRead()可表示包括执行的对象读取例程,以例如通过对象的动态结构或形状经由表格查找操作或散列操作来解析或定位对象的属性或字段值。ExpectedStructure可表示在运行时期间之前出现的对象类型,其中偏移量值OffsetOfF已被解析。
可根据对象(例如,o)是否已具有标引字段(例如,f)而以不同方式编译用于访问对象的典型对象写入程序声明(例如,用于利用值v来更新对象o的属性f的o.f=v)。由于动态语言诸如JavaScript中的对象不必具有其预先声明的字段,所以可能常见的是在运行时期间执行随时动态产生新字段的对象写入。同样,如同在其他必要的编程语言中,常见的是覆写对象的现有字段的字段值。
在其他实施例中,在经由以下操作例如ExistingWrite()可执行对写入到已存在的字段(例如,用于将值v写入对象o的现有字段f的o.f=v)的对象的写入访问(例如,o.f=v)的情况下:
ExistingWrite()可包括例如经由原子机器指令通过Cell.index的间接索引(例如,加载指向指针的指针)。即使字段值改变,也可保证Cell.index处的指针的值保持不变。SlowPathWrite()可表示包括执行的对象写入例程,以解析类似于SlowPathRead()的对象的字段值。
在经由以下操作例如AdditiveWrite()可执行对用于写入不存在的字段的对象的写入访问(例如,o.f=v)的情况下:
在一个实施例中,AdditiveWrite()可保证Cell.strucutre和Cell.index(例如,表示对象的结构和有效载荷)在一次原子操作诸如CAS()操作中同时变化。
CAS(比较和切换)操作可为支持硬件或处理器的例程,以保证在不间断的情况下以原子形式完成比较操作和切换操作两者。在一个实施例中,CAS操作可为两个字词原子以同时改变对象的结构(例如,Cell.structure)和索引(例如,Cell.index)两者,只要两个字词在存储器中相邻定位即可。
索引值Value*条目可经由“reallocateIndex()”复制在AdditiveWrite()中,而无需复制条目所标引的任何字段值。附加字段值或Value框可经由“new Value()”分配在存储器中以为对象保持一个字段或属性值。值v可被存储到该新分配的Value框中。
在一个实施例中,对用于基于并发对象模型来删除对象的字段的对象的访问可保证对象的索引(例如,Cell.index)包含不变的指针。字段的重复删除可迫使对象成为普通散列表,其中可对对象访问的优化解激活。例如,如果在对象成为普通散列表之前添加对象的所删除的字段,并发对象模型可能未收回所删除的字段的存储器。一旦对象成为散列表(例如,处于散列表模式),对对象的访问可使用每个对象锁定,以用于同步多次访问。在某些实施例中,垃圾收集机制可压缩或收回不再使用或不活动的对象索引。
图3为示出了用于执行共享共同动态类型化对象的多个线程的一个示例性运行时的框图。运行时301可与图2的系统200相关联。例如,运行时301可包括图2的运行时数据211的一部分。在一个实施例中,共享堆303可包括经由多个线程或过程诸如线程1315、线程2317或经由一个或多个处理器的其他可适用线程或过程来共享的运行时数据或对象。
例如,在线程1315和线程2317之间共享的动态类型化对象O 319可对应于对象单元307。对象O 319可具有经由结构305表示的动态属性以及一个或多个属性值311,313等。结构305可指定对象O 319的动态类型。例如,结构305可包括动态属性的属性名和位置信息诸如存储器偏移量,以定位对应属性值。
对象单元307可经由直接指针或间接指针来标引其属性。例如,对象单元307可包括指向结构305的直接指针和经由索引309用于属性值311,313的间接指针。索引309可存储指针阵列,每个指针指向一个属性值(或属性存储装置)。针对每个属性值在结构305中的位置信息可对应于对索引309的指针阵列的索引。
可经由线程1315和线程2317来并发执行访问对象O 319的操作。对象访问操作可包括Read()、ExistingWrite()、AdditiveWrite()和/或Delete()等。每个对象访问操作可要求多于一个原子机器指令。并发对象模型可允许向对象O 319添加附加属性,而无需复制现有属性值311,313,从而避免复制属性值与更新属性值之间的竞争状况。
图4示出了经由并发执行共享的动态类型化对象的示例性分配。实例400可基于图2的系统200的一些部件。例如,对象O 403可被分配在图2的运行时数据211中。在时间实例T1423处,对象O 403可具有在结构401中指代的具有对应属性值10、12和8的属性(E、F、G)。对象O 403可标引存储指针阵列的索引405,其中指针指向属性值。
在一个实施例中,结构401可为每个属性(例如,E、F或G)指定偏移量,以针对对应属性值将指针定位在索引405中。例如,偏移量2可被识别用于结构401中的属性F,以将指针定位在偏移量2处,从而指向存储属性值12的属性存储装置411。时间T1423处的对象O 403可具有与如(E:10,F:12,G:8)的名称-值对(或字段值)对应的动态属性。
线程T1和T2409可同时访问对象O 403,而无需采用软件同步机制诸如锁定、关键部分等。例如,线程T1可执行程序声明o.f=3(例如,经由ExistingWrite())以利用值3来更新属性F。同时,线程T2可执行程序声明o.h=5(例如,经由AdditiveWrite())以将具有值5的新属性H添加到对象O 403。
作为并发执行或同步执行T1和T2409的结果,对象O 403可与单独结构413和单独索引415相关联,以动态地生长其结构,从而适应新添加的属性(或属性、字段)H。结构413可包括(前一个)结构401的副本以及新添加属性H的属性。索引415可包括(前一个)索引415的副本以及指向存储属性值5的新分配的属性存储装置421的指针。换句话讲,对象O 403的结构可从结构401重新分配到结构413,并且对象O 403的索引可从索引405重新分配到索引415。用于现有属性值的属性存储装置诸如属性E的属性存储装置419保持不变。属性存储装置411利用属性F的属性值3进行更新。由于现有属性值保持存储在相同属性存储装置中,所以可避免更新和重新定位属性值的竞争状况。
图5为示出了用于生成用于访问动态类型化对象的并发可执行指令的过程的一个实施例的流程图。示例性过程500可由例如包括图2的系统200的一些部件的处理逻辑部件来执行。在块501处,过程500的处理逻辑部件可在运行时期间在存储器中提供对象模型,以表示在动态编程语言诸如JavaScript中的源代码中指定的动态类型化对象。源代码可包括用于指定对象的声明而无需声明对象的类型或结构。
对象模型可包括属性结构、索引结构和/或针对在源代码中指定或标引的对象分配的值存储装置。属性结构可为在存储器(或存储器的地址空间)中分配的结构化数据,以存储对象的一个或多个现有属性。现有属性可指示在运行时期间用于对象的当前动态类型。
在一个实施例中,对象的值存储装置可被动态分配在存储器中,以存储对象的现有属性值。每个属性值可单独对应于对象的现有属性中的一个现有属性。对象的索引结构可被动态分配,以为对应现有属性存储对属性值的标引。标引可为指向存储器地址的直接指针或间接指针(例如,经由执行代码或其他可适用机制),以定位用于存储属性值的值存储装置。
在块503处,过程中的处理逻辑部件可从源代码生成第一指令以用于对对象的第一访问。源代码可包括程序声明,以利用第一访问的所更新的属性值来更新现有属性中的一个现有属性。在一些实施例中,对所更新的属性值的第一访问可指示属性已从对象中删除。第一指令可包括操作诸如ExistingWrite(),Delete()等。
在一些实施例中,可在源代码中指定对对象的第一访问,以利用所更新的属性值来更新对象的现有属性。可利用内联高速缓存代码来针对第一访问编译第一指令,从而包括对对象的期望属性结构的标引。期望属性结构可指定偏移位置以用于针对现有属性定位属性存储装置。例如,偏移位置可为对用于指向属性存储装置的指针的索引结构的索引偏移量。第一指令可针对对象的第一访问嵌入偏移位置和对象的期望属性结构。
在一些实施例中,第一指令可嵌入偏移位置和对象的期望属性结构以用于定位对象的现有属性的属性值。偏移位置可在期望属性结构中指定。例如,偏移位置可包括对索引结构中的指针阵列的索引。在一个实施例中,第一指令可包括操作,以确定对象的属性结构是否对应于对象的期望属性结构。如果对象的属性结构对应于期望属性结构,则可执行第一指令以执行第一访问,从而经由嵌入第一指令中的偏移位置利用所更新的属性值来更新属性存储装置,而无需执行表格查找操作。
编译器诸如图2的编译器205可基于与运行时执行相关联的运行时数据来为对象生成具有期望属性结构的第一指令。例如,过程500的处理逻辑部件可分析运行时配置文件诸如在图2的运行时数据211中收集的配置文件数据,以预测用于访问对象的期望配置文件结构。另选地或可选地,过程500的处理逻辑部件可基于从外部输入诸如至其他处理模块的用户输入或界面提供的启发或提示来确定对象的期望属性结构。
在块505处,过程500的处理逻辑部件可生成第二指令以用于对对象的第二访问。第二访问可由源代码指定以利用对象的附加属性值来更新附加属性。当执行第二指令以用于对对象的第二访问时,对象的现有属性可不包括附加属性。
第二指令可被执行以分配单独属性结构、单独索引结构和针对对象存储附加属性值的附加值存储装置,该单独属性结构存储现有属性和附加属性,该单独索引结构存储对值存储装置的单独标引以及对与附加属性对应的附加值存储装置的附加标引。
在一个实施例中,源代码可针对对象的第二访问来指定第二属性标识符。过程500的处理逻辑部件可确定第二属性标识符是否识别在属性结构中存储的现有属性中的一个现有属性。例如,由于第二属性标识符识别出在属性结构中没有现有属性(例如,AdditiveWrite()),所以过程500的处理逻辑部件可生成第二指令。
在块507处,过程500的处理逻辑部件可并发执行第一指令和第二指令,以例如经由单独线程来执行对对象的第一访问和第二访问。可执行第一指令以更新值存储装置中的与现有属性中的一个现有属性对应的一个值存储装置(例如,ExistingWrite())。可执行第二指令以向对象的现有属性添加附加属性(例如,AdditiveWrite())。
根据某个实施例,对象模型(或并发对象模型)可包括属性标引和索引标引。指向属性结构的属性标引可表示对象的动态类型。指向索引结构的索引标引可表示对象在动态类型下的动态数据值或属性值。属性结构可存储相对于用于存储对属性值的指针或标引的索引结构的索引标引的偏移量。偏移量可允许经由索引结构的对属性值的间接标引。
在一个实施例中,对象的属性标引可包括在执行第一指令和第二指令之前指向属性结构的指针。属性标引可在并发执行第一指令和第二指令之后指向单独属性结构。
在一些实施例中,第二指令可包括对对象的原子更新操作以同时更新属性标引和索引标引两者。例如,可执行原子更新操作以将属性标引与对属性结构的标引进行比较,并且如果基于比较该属性标引对应于对属性结构的标引,则设置属性标引以指代所更新的属性结构。可经由硬件来支持(例如,内置于处理器中的逻辑部件中)以原子形式执行的比较操作和设置操作。
过程500的处理逻辑部件可从源代码生成第三指令以用于对对象的第三访问。第三访问可在源代码中被指定以获取或读取对象的属性值。第三指令可包括内联高速缓存操作,以确定对象的属性标引是否指代属性结构。并发对象模型可允许并发执行第二指令和第三指令。
图6为示出了用于基于具有索引标号的对象模型来并发访问对象的属性值的过程的一个实施例的流程图。示例性过程600可由例如包括图2的系统200的一些部件的处理逻辑部件来执行。在块601处,过程600的处理逻辑部件可生成第一指令以用于对源代码中指定的对象的第一访问。对象可具有用于标引指向一个或多个值存储装置的指针的索引标引,该一个或多个值存储装置存储对象的现有属性值。第一指令可以原子形式来更新索引标引以指代单独指针,该单独指针指代用于存储现有属性值的值存储装置和用于存储附加属性值的附加值存储装置。
在块603处,过程600的处理逻辑部件可从源代码生成第二指令以用于对对象的第二访问。第二访问可在源代码中指定,以利用所更新的属性值来更新对象的现有属性值中的一个现有属性值。
在块605处,过程600的处理逻辑部件可并发执行第一指令和第二指令,以执行对对象的第一访问和第二访问。可保证对象在执行之后具有包括所更新的属性值和附加属性值的属性值。
并发内联高速缓存优化
用于访问用于并发设置中的优化的内联高速缓存的动态类型化对象的内联高速缓存代码可在运行时期间自修改。内联高速缓存代码可包括用于访问动态对象的快速代码路径和慢速代码路径。当被执行时,内联高速缓存代码可根据遇到的对象动态类型或属性来确定是否调用快速代码路径或慢速代码路径。
在一个实施例中,并发设置可包括允许经由多线程和/或由一个或多个处理器托管的多次处理的并发执行的操作环境。所修改的内联高速缓存代码可在用于处理器的优化的内联高速缓存中复位,以观测所修改的内联高速缓存代码中的指令的变化。
根据某个实施例,优化的内联高速缓存可经由初始操作和连锁操作来修改内联高速缓存代码(例如,就地编辑)。可执行初始操作来修改(或初始化)未设置的(或未初始化的)内联高速缓存代码,以为特定对象属性或结构指定内联高速缓存代码。所指定的内联高速缓存代码可包括在遇到具有特定对象属性的对象时被调用的快速代码路径。可执行连锁操作以修改内联高速缓存代码(例如,初始化的或未初始化的)以经由所生成的短插芯(例如,指向所生成的函数代码的一段代码或函数指针)来调用慢速代码路径。
可执行初始操作而无需处理器指令高速缓存进行刷新,从而允许内联高速缓存以有效方式锁定(或初始化)。在一个实施例中,可由特定线程诸如线程偏置执行初始操作来实现初始化代码,从而稳定(或初始化)其内联高速缓存代码中的大多数内联高速缓存代码而无需交叉修改代码(例如,在不同线程之间)。线程偏置可允许具有代码修改的内联高速缓存,以在一个线程上运行而无需不同线程之间的同步指令。
在一个实施例中,可缓冲在优化内联高速缓存过程中的多个线程所共享的代码块的修改而不立即进行代码修改。当执行复位操作时,这些修改可被更新到代码块(例如,经由函数指针等)。因此,可减小修改已并发运行的内联高速缓存的成本。
对内联高速缓存代码的复位操作可根据指定时间调度和/或经由非频繁调用的系统例程诸如垃圾收集例程来启动以减小对执行环境的整个系统性能的影响。在一个实施例中,观察点例程例如基于图2的指令高速缓存刷新模块219可根据指定调度(例如,每10ms或其他可适用时间间隔)唤醒以执行复位操作。
在一个实施例中,可缓冲在优化内联高速缓存过程中的多个线程所共享的代码块的修改而不立即进行代码修改。当执行复位操作时,这些修改可被更新到代码块(例如,经由函数指针等)。因此,可减小修改已并发运行的内联高速缓存的成本。
在一个实施例中,内联高速缓存可包括用于动态对象属性查找的优化机制。例如,内联高速缓存代码可如下(例如,以伪代码表示)在编译时间被发出:
由于ExpectedStructure和OffsetOfF的值还未知,所以初始生成的代码可具有ExpectedStructure的可保证给出比较声明的错误结果的假值,即,o->structure不等于ExpectedStructure。
稍后,当首次执行SlowPathRead()时,可修改ExpectedStructure和OffsetOfF。由于ExpectedStructure和OffsetOfF的值在代码中为常数,所以修改可直接改变机器代码序列。并发设置中的优化的内联高速缓存可保证其他处理器何时能观测该机器代码的这些变化或编辑以及代码部分改变的次序。例如,如果在ExpectedStructure之前编辑OffsetOfF,则可要求另一处理器按照相同次序而不是相反次序查看编辑,以消除在观测到OffsetOfF的值的变化之前快速路径经由该处理器被占用的可能性。
在一个实施例中,内联高速缓存可通过直接在调用点处记下先前方法查找的结果来加速运行时方法绑定。假定在特定调用点处出现的对象通常为相同类型,则通过存储方法调用“内联”的结果即经由内联高速缓存直接在调用点处进行存储可提高性能。在一个实施例中,例如当ExpectedStructure和OffsetOfF的值还未知时,调用点可能还未被初始化。一旦语言运行时达到特定未初始化调用点,便可执行动态查找,存储调用点处的结果并且对该调用点进行初始化。如果语言运行时再次达到相同调用点,则可从其获取被调用函数并且直接将其调用而无需执行任何更多查找。
为了考虑不同类型的对象在相同调用点处出现的可能性,语言运行时可能不得不向代码插入保护条件,诸如o->structure==ExpectedStructure的声明。更常见地,这些保护条件被插入到被调用者的导言而非调用点处,从而更好地利用分支预测并且节省由于在每个调用点处的导言对多个副本中的一个副本占据的空间。如果已初始化的调用点遇到其期望的类型之外的类型,则可再次执行全动态查找,就好像未被初始化。
在一个实施例中,优化的内联高速缓存可允许并发自修改代码在指令中修改多于一个字长代码位置,而无需处理器立即观测改变的指令。处理器高速缓存刷新机制可被执行,以使一个或多个处理器与改变的指令同步。
例如,无论哪个是较小的,处理器每次均不可能读取少于一个对准字词或一个指令。在x86处理器上的5字节指令的立即数(被包含在指令中的恒定操作数)可为32位字词并且该字词被对准。如果从另一线程使用写入来改变或修改立即数,则执行该指令的一个或多个处理器可能一直查看(或处理)写入*之前*的指令或者写入*之后*的指令,而无需查看包括旧指令的一部分和新指令的一部分的撕版指令。
由于内联高速缓存要求修改多于一个字长代码位置,所以可能由于处理器指令高速缓存而无法保证处理器立即观测到改变的指令。此外,当获取已被修改的指令时,可能无法保证处理器将执行存储器加载的次序和粒度。例如,对于代码修改可按照精确次序来修改两个不同指令,诸如在一个指令上“第一次”写入然后在另一指令上“第二次”写入。可能无法保证在该处理器对指令的“第一次”写入之前一些其他处理器不解码指令的“第二次”写入。
在一个实施例中,处理器何时查看(或观测)改变或修改的指令可取决于在该处理器上执行高速缓存刷新机制的时刻。高速缓存刷新机制例如可包括基于的处理器的CPUID或类似的其他硬件上的其他类似刷新机制。例如,可在处理器上执行cupid来实施将由处理器获取的指令的次序。类似地,如果一个指令改变并且随后在该处理器上执行CPUID的同类操作,则可保证处理器将观测到新指令。
在一个实施例中,可经由销钉到(例如,限制运行在)每个处理器的线程在多个处理器上执行Cpuid来唤醒处理器,以例如执行指令高速缓存刷新。Cpuid可作为背景切换的一部分来执行,例如存储和恢复处理的状态或上下文,使得可稍后从相同点恢复该执行。执行的这些点(或指令)(例如,光安全点或光点)相比较在典型多线程虚拟机中见到的安全点机械方式可造成较轻的性能影响。
在一个实施例中,可基于修改汇编代码来执行内联高速缓存初始化,该修改汇编代码诸如:
例如,可在初始化期间利用其他值来修补或修改代码中的常量,诸如指针宽度常量(例如,“cmpq%0,(%rax)”中的0)和/或字节宽度常量或整型宽度常量(例如,“movq 0(%rax),%rax”中的0)。指针宽度常量可表示结构校验值而字节宽度常量或整型宽度常量可表示加载偏移量值。“compq$0”中的常量值0可确保初始调用慢速代码路径(例如,“Lslow”)。汇编代码的处理器可在修补(或初始化)“movq”的常量之前不观测用于“cmpq”的常量的非零值。
优化的内联高速缓存可允许内联高速缓存代码相当快地锁定(或初始化)而无需请求光点(例如,用于刷新处理器指令高速缓存)以初始化每个内联高速缓存代码。初始化的内联高速缓存代码可在优化的内联高速缓存时被执行而不会造成附加开销(例如,引起较慢的执行)。在一个实施例中,可利用存储器缓冲器来减小修改并发运行内联高速缓存代码时的潜在高成本。
可执行优化的内联高速缓存而无需取决于处理器表现的特定假设(例如,指令在处理器中如何获取和执行)。根据一些实施例,当例如与非并发内联高速缓存执行进行比较时,优化的内联高速缓存可经由多核(例如,N核)处理器针对运行代码执行的多个(例如,N个)实例提供线性加速(例如JavaScript基准版本7代码(或V8基准代码)),而不会造成经由单个处理器的单个实例的性能降级。
在一个实施例中,内联高速缓存初始化可被卸载到解译器以避免交叉修改代码。解译器运行的“代码”受到类似于适用于不同处理器间的“数据”的那些规则的存储器排序规则约束。因此,解译代码比可执行机器指令更容易修改。例如,双-CAS(例如,双字词比较和切换原子操作)可适用于改变结构校验和加载---偏移量以修改解译代码。随后,当经由JIT(即时或运行时)编译器来编译相同的内联高速缓存代码时,内联高速缓存代码可预先初始化为解译器上次查看的状态。因此,可能不需要执行昂贵的初始化过程(例如,利用指令高速缓存刷新来对代码进行自修改)。
另外,代码块偏置(例如,经由特定线程来执行)可进一步减小内联高速缓存代码初始化的开销,诸如内联高速缓存代码的初始化状态和未初始化状态之间的频繁变化(例如,乒乓变化)。代码块(例如,函数代码)的执行可开始于线程本地假定(例如,仅利用一个线程来执行)。在(内联高速缓存代码的)初始化期间,大多数代码可仅在一个线程上执行。这些代码的线程偏置可由编译代码块的线程来确定。
在一个实施例中,每个代码块可包括代码块的顶部处的用于偏置线程的线程检查保护。在执行期间,如果(对代码块的)调用者已运行在偏置的线程上,则可跳过该保护代码。被偏置(例如,经由偏置的线程来执行)的代码块的内联高速缓存代码可允许被修补而无需并发考虑。
一旦代码块的线程检查保护由于来自不同线程的调用采用慢速路径,代码块便可被标注(或修改)为要求并发内联高速缓存和线程检查保护可被修补,诸如利用nop(或无操作代码)来替代线程校验指令。线程检查保护的存在可迫使尝试调用代码块的所有其他线程针对代码块中的内联高速缓存代码来采用慢速代码路径。并发内联高速缓存代码可被调用以用于内联高速缓存并且仅在共享的代码块中,该内联高速缓存在解译器预热(例如,经由解译器初始化或预焙)之后改变状态(例如,被初始化)。
可在内联高速缓存代码上执行的操作可包括例如采用未设置内联高速缓存并将其修改使其专用于某个属性/结构的初始化操作、采用初始化或未设置的内联高速缓存并将其修改使得慢速路径分支到达所生成的短插芯的连锁操作、由于观察点执行来复位内联高速缓存的观察点操作(例如,调度的处理器指令高速缓存刷新)以及由于对象消亡而在GC(垃圾收集)操作期间复位内联高速缓存的GC操作。
初始化操作和连锁操作可要求两个分立操作。对于初始化操作,这两个操作可包括:1)将偏移量(例如,加载偏移量值)修补为加载(例如,加载汇编代码)以及2)将结构(例如,结构校验值)修补为比较(例如,比较汇编代码)。对于连锁操作,这两个操作可包括:1)生成短插芯(例如,表示函数的一段代码)和2)将慢速路径分支(例如,汇编代码中的指针)修补为短插芯。优化的内联高速缓存可禁止处理器观测(或查看)操作(2)直到处理器已观测到操作(1)而无需针对每个初始化操作和连锁操作在操作(1)和(2)之间执行光点(例如,指令高速缓存刷新)。
例如,针对基于的处理器中的连锁操作的操作(2)可为如JIT代码的分支的原子级操作(例如,那些小立即数中的一个小立即数)。对于基于的处理器中的初始化操作的操作(1)可包含多个指令并且可能不是原子级操作。为了加强对于基于的处理器(例如,处理器)中的初始化操作的操作(1)和(2)之间的次序,偏移量(例如,加载偏移量值)可被修补为加载(例如,加载汇编代码)以及结构的较低16位(例如,结构校验值)-使得高位仍为零。由于可能不存在值<2^16的结构(例如,表示对象的动态类型),所以即使处理器观测到对偏移量的修补,该内联高速缓存代码还可调用慢速代码路径。随后,在可能需要昂贵处理资源(例如,大约100微秒的性能开销)的光点(例如,指令高速缓存刷新)之后,结构的高16位(例如,结构校验值)可被修补为比较(例如,比较汇编代码)。
在一个实施例中,优化的内联高速缓存可提供缓冲机制来减小性能成本,以实施并发内联高速缓存的操作次序。例如,假定线程(例如,光点线程)执行以下操作(伪代码方式):
可利用安全点(例如,如经由垃圾收集器来调用)来替代光点(例如,经由专用指令高速缓存刷新线程来调用)。初始化操作和连锁操作可允许包括:
其中在操作(1)中修补偏移量或者生成短插芯,由于还未执行操作(2),所以其可被观测但不能被处理器执行。因此,共享代码块中的内联高速缓存初始化被延迟最多10ms(或可适用于调度光点线程的其他时间间隔)。在一个实施例中,光点线程可仅在缓冲非空以删除不必要的光点执行时(例如,当未修改指令时或当缓冲为空时)被调度(或唤醒、调用)。
当调用GC例程时,保证执行的安全点。因此,GC例程可尽其所能修改内联高速缓存代码,只要保证在处理/线程唤醒之前执行CPUID(例如,指令高速缓存刷新)即可。
当观察点例程被启动或调用时(例如,不管给定表达式的值如何变化均停止执行应用,而无需指定其可能发生的位置),可要求所有线程立即观测跳转替代(或并发慢速代码路径)或内联高速缓存复位。例如,请求watchpoint.fire()的线程不应当允许进一步前进,直到所有其他线程观测到其代码的变化。但是观察点不太常见。
在一个实施例中,观察点代码(例如,经由watchpoint.fire()来执行)可在内联高速缓存代码中的所有跳转被替代并且内联高速缓存代码被复位之后执行光点操作(例如,指令高速缓存刷新)。代码块线程偏置优化可适用于观察点代码。例如,如果除了执行观察点代码的线程之外的线程未共享或拥有代码变化,则可不执行光点操作。
因此,可执行优化的内联高速缓存而不会减慢初始化代码,以相对快速地锁定内联高速缓存代码并且无需光点操作来初始化每个内联高速缓存代码。内联高速缓存代码可利用经由低水平解译器稳定的大部分内联高速缓存代码初始化,而无需交叉修改代码。对于在复位状态中存活(例如,未初始化)的进入JIT中的那些内联高速缓存代码,它们中的大多数仍将在该点处运行在一个线程上。
在一个实施例中,线程偏置可允许线程修改其他线程未共享的内联高速缓存代码,而没有并发开销。来自内联高速缓存代码更新缓冲的速度减慢可仅发生在例如多于一个线程所共享的小数量内联高速缓存代码中。优化的内联高速缓存可不添加用于运行初始化的内联高速缓存代码的附加开销。
在一个实施例中,缓冲机制可减轻修改并发运行的内联高速缓存代码所需的潜在昂贵处理资源。当与急切更新内联高速缓存更新(例如,无缓冲)相比时,用于更新内联高速缓存代码的缓冲机制不会引起明显的速度减慢。缓冲机制可保证光点不得不执行的频率几乎得到限制。尽管当实际启动的观察点可能影响共享代码时,当然也可不采用观察点,除了观察点可不自动启动的情况之外(例如,其中充足的理由认为观察点将不启动)。
优化的内联高速缓存可与处理器表现的任何假定无关。可应用光点(例如,经调度的指令高速缓存刷新)来确保处理器诸如X86处理器、AMR处理器或其他可适用处理器的现有性能与优化的内联高速缓存的需求一致,诸如用于同步指令序列的指令高速缓存刷新。尽管多个指令可构建经修补或修改的每个立即数(例如,指令操作数诸如结构校验值或加载偏移量值),但是优化的内联高速缓存可确保内联高速缓存代码可在一个指令被准确地开启之前保持缓慢运行。可仅在迫使一个或多个处理器观测在内联高速缓存代码上所作的修改的其他部分之后开启指令。
因此,当在多核(例如,N核)处理器上运行基准代码(例如,基于V8基准JavaScript代码)的多个(例如,N个)实例时,优化的内联高速缓存可提供线性加速。生成用于运行基准代码的大多数内联高速缓存代码可非常早地初始化,例如在JIT(例如,编译器)开始(即,调用)之前。对于存活下来未设置到JIT中的那些少量内联高速缓存代码(例如,当调用JIT时还未初始化),使用高速缓存更新缓冲可使得速度减慢(例如,由于修改并发运行的内联高速缓存代码)变得可忽略不计。换句话讲,在其他预热活动(例如,内联高速缓存代码的初始化)消退之前可刷新缓冲。
图7A-图7B为示出了针对并发执行来优化的内联高速缓存的代码块的运行时系统的框图。系统700可包括图2的系统200的一些部件。现在转到图7A,优化的内联高速缓存代码生成器模块207可包括初始内联代码生成器模块701和并发内联代码生成器模块703,以用于生成用于优化的内联高速缓存的自修改代码。
在一个实施例中,初始内联代码生成器模块701可从经由JIT编译器诸如图2的编译器205编译的源代码提供未初始化的串行内联高速缓存代码。串行内联高速缓存代码可包括串行慢速代码路径(例如,SlowPathRead())以及快速代码路径(例如,基于加载偏移量值的汇编代码)。快速代码路径可包括用于访问值或从处理器寄存器(而非存储器地址)加载值的少量汇编指令(例如,四个指令)。
串行慢速代码路径可仅由一个单线程来执行。在一些实施例中,初始内联代码生成器模块701可发出保护代码(例如,用于检查线程身份)以提供线程偏置以用于执行串行内联高速缓存代码。例如,初始内联代码生成器模块701可经由也执行由初始内联代码生成器701所生成的串行内联高速缓存代码的线程来调用。线程偏置可允许不经常运行的代码在单一线程中执行而无需刷新处理器指令高速缓存以用于就地代码修改。
并发内联代码生成器模块703可提供可被初始化或可不被初始化的并发内联高速缓存代码。并发内联高速缓存代码能够在由多线程并发运行时进行自修改。在一个实施例中,并发内联高速缓存代码可包括并发慢速代码路径和快速代码路径。并发慢速代码路径可由多于一个线程来执行。在一个实施例中,并发慢速代码路径可包括缓冲操作,以经由代码缓冲器来执行代码自修改(例如,对于内联高速缓存代码初始化)以减小将代码修改与每个处理器同步的昂贵的指令高速缓存刷新的次数。
现在转到图7B,运行时709可包括图2的运行时数据211的一部分。在一个实施例中,代码指针711可为指针诸如函数指针,以用于调用一段代码或代码块,以例如实现在源代码中指定的函数。在一个实施例中,代码指针711可标引作为函数的单独具体实施(或编译代码)的内联高速缓存代码块713或内联高速缓存代码块717。
可经由图7A的初始内联代码生成器模块701来为函数生成内联高速缓存代码块717。例如,内联高速缓存代码块717可包括具有用于函数中的对象数据访问的慢速串行代码路径的慢速串行代码721。线程检查保护719可为内联高速缓存代码块717的执行提供线程偏置性能。
可经由图7A的并发内联代码生成器模块703来为函数生成内联高速缓存代码块713。内联高速缓存代码块713可包括用于并发慢速代码路径的慢速并发代码715和具有慢速串行代码路径的慢速串行代码721,每一者均用于函数中的对象数据访问。当由多于一个线程并发运行时,慢速并发代码715能够进行自身代码修改。例如,慢速并发代码715可在代码缓冲器723中修改还未被调用的函数的代码块。因此,对代码缓冲器723的修改可经由锁定机制同步而无需处理器指令刷新。在一些实施例中,代码缓冲器723中的代码块可在由代码指针711标引(指向)时变成活动的。
图8示出了用于利用内联高速缓存代码来动态编译代码块的并发执行的示例性时间线。实例800可基于图2的系统200的一些部件。例如,线程1803和线程2805可执行包括图2的可执行代码215的部分的指令。线程1803和线程2805两者可执行包括对在动态编程语言诸如JavaScript中指定的函数foo 807的调用的代码。
在一个实施例中,在(或大约在)时间实例T1801处,线程1803和线程2805基本上并发调用函数foo 807。在首次被调用时,可例如经由图2的JIT编译器205来编译函数foo 807(例如,代码在被执行时才被编译)。在时间实例T2813处,线程2805可继续编译函数foo 807而线程1803阻止等待编译的结果(例如,每次只有一个线程被允许对相同代码进行JIT编译)。
在时间实例T3815处,线程2805可完成编译函数foo 807以例如经由图7的初始内联代码生成器模块701来生成初始内联高速缓存代码块809。线程2805可通知线程1803已完成对函数foo的编译。代码块809可包括串行慢速代码路径S2、S3以用于函数foo中的对象访问。在一个实施例中,代码块809可包括保护代码(例如,包括用于识别线程2805的线程标识符thread_2)以用于线程偏置。例如,代码块809的保护代码S1可将串行慢速代码路径S2、S3的执行限制到线程2805。在时间实例T3处完成编译函数foo之后,线程2805可根据代码块809继续执行步骤或操作S1、S2...S5。
在经由线程2805被通知已完成对函数foo 807的编译之后,线程1803可唤醒以调用代码块809的函数foo。由于线程1803与不同于线程2805的线程标识符(例如,代码块809的thread_2)相关联,所以对代码块809的保护代码S1的执行可使得线程1803重新编译函数foo 807。
在时间实例T4817处,函数foo 807可经由线程1803重新编译为代码块811而线程2805继续执行用于函数foo 807的代码块809的指令。在一个线程中的重新编译可不需要限制其他运行线程。在一些实施例中,线程1803可被要求抓住/释放锁定(例如,具有大约20纳秒-40纳秒的性能开销)以执行重新编译。
代码块811可包括例如经由图7的并发内联代码生成器模块703发出的并发内联高速缓存代码S7、S8。在一个实施例中,代码块811可基于对代码块809的修改。例如,代码块809的安全代码S1可成为等同于代码块811中的步骤S6的nop(例如,空操作)。在T3815和T4817之间的时间段819期间,代码块809可对应于活动代码块以用于针对线程1803和线程2805的运行时来实现函数foo 807。在时间实例T4817诸如时间段821之后,代码块811可替代代码块809作为运行时过程中的用于函数foo 807的活动代码块。
图9为示出了用于自修改内联代码访问用于并发执行的动态类型化对象的过程的一个实施例的流程图。示例性过程900可由包括图2的系统200的一些部件的处理逻辑部件来执行。在块901处,过程900的处理逻辑部件可例如经由图7的初始内联高速缓存代码生成器模块701来从源代码块生成初始内联代码。源代码块可属于在动态(或动态类型化)编程语言中指定的源代码。
例如,源代码块可包括用于指定对对象的至少一次访问的程序声明。源代码可不包括说明对象的类型或结构的任何程序声明。在一个实施例中,对象可与动态结构相关联,该动态结构包括具有对应属性值的一个或多个属性。对象类型可对应于在运行时期间确定的动态结构。
在一个实施例中,初始内联代码可具有串行内联高速缓存代码以执行对对象的访问(例如,读取、写入、更新、删除或其他可适用数据加载/操纵操作)。串行内联高速缓存代码可包括串行慢速代码路径和快速代码路径。代码路径可为将要由处理器执行的汇编指令序列。快速代码路径可由具有例如大约5纳秒的性能开销的少量(例如,小于10个)汇编指令来执行。在一个实施例中,串行慢速代码路径可包括由解译器执行的表格查找操作(例如,大约100纳秒的性能开销)。串行内联高速缓存代码可包括比较操作,以确定是否经由快速代码路径或串行慢速代码路径来执行对对象的访问。
在块903处,过程900的处理逻辑部件可例如经由图7的并发内联代码生成器模块703来从源代码块生成并发内联代码。并发内联代码可具有并发内联高速缓存代码,以对动态类型化对象进行数据访问。并发内联高速缓存代码可包括并发慢速代码路径和快速代码路径。并发内联高速缓存代码可包括比较操作,以确定是否经由快速代码路径或并发慢速代码路径来执行对对象的数据访问。并发慢速代码路径可包括独立于解译器将被执行的表格查找操作。
在块905处,过程900的处理逻辑部件可经由特定线来程执行初始内联代码,从而执行对对象的数据访问。在一个实施例中,串行内联高速缓存代码可嵌入(例如,作为指令的立即数)与对象类型或对象的动态类型相关联的一个或多个常量参数,诸如加载偏移量常数值和/或结构检查值。常量参数中的至少一个常量参数诸如加载偏移量值可被包括在快速代码路径中。
可基于常量参数来确定是否执行快速代码路径或串行慢速代码路径。可经由特定线程来执行串行慢速代码路径以更新(或自修改)嵌入串行内联高速缓存代码内的常量参数。串行慢速代码路径可包括对编译器(例如,JIT编译器)的回调函数以用于重新编译。
在一个实施例中,过程900的处理逻辑部件可经由解译器执行串行慢速代码路径以更新用于对快速代码路径进行初始化的常量参数。解译器可在多个处理器间调用数据一致性或同步机制以共享初始化快速代码路径,而无需在多个处理器间调用指令一致性机制(例如,指令高速缓存刷新)。处理器可将指令预取至指令高速缓存。指令高速缓存刷新可要求处理器停止并且在指令高速缓存清除后恢复。
根据某些实施例,串行内联高速缓存代码中的常量参数的值可在生成并发内联代码之前经由特定线程来更新。在生成并发内联高速缓存代码时可标引(例如,经由JIT编译器)串行内联高速缓存代码中的常量参数的所更新的值。
在一个实施例中,常量参数中的一个常量参数可指示指向对象的动态结构的指针,以表示对象的类型。常量参数中的单独的一个常量参数可具有与偏移量对应的值以定位用于访问对象的存储器地址。例如,对象可与在存储器地址中存储的属性值相关联。对对象的访问可包括针对在存储器地址中存储的属性值的加载(或存储)操作。如果对象具有与常量参数的值不对应的动态结构(或类型)(例如,指示指向动态结构的指针),则可经由表格查找操作或搜索操作来确定存储器地址以用于访问对象。
初始内联代码可包括保护代码以抑制线程执行串行内联高速缓存代码。例如,初始内联代码可经由特定线程生成并且可执行保护代码以确定是否将线程识别为特定线程,以被允许执行包括串行内联高速缓存代码的初始内联代码。
在一个实施例中,作为执行初始内联代码中的保护代码的结果,可生成并发内联代码。如果执行保护代码的线程不同于生成初始内联代码的特定线程,则保护代码可使得重新编译操作生成并发内联代码。初始内联代码和并发内联代码两者可从共同源代码块进行编译。并发内联代码的生成可基于对初始内联代码的修改。例如,初始内联代码的保护代码可被修补为无操作代码以允许线程执行并发内联高速缓存代码,而与线程的身份无关。
在块907处,过程900的处理逻辑部件可经由一个或多个线程来执行并发内联代码以执行对对象的数据访问操作。并发内联高速缓存代码可嵌入常量参数以用于执行快速代码路径。并发内联高速缓存代码的并发慢速代码路径可被并发执行以更新并发内联高速缓存代码的常量参数的值。
在一个实施例中,并发内联代码的副本可被存储在代码缓冲器中。并发内联代码在代码缓冲器中的副本可被修改以例如经由自修改代码来更新常量参数。对并发内联代码副本的修改可与在多线程间利用对并发内联代码的执行而不同步地执行。
在一个实施例中,可由能够进行指令高速缓存的一个或多个处理器执行并发内联代码。例如根据独立于修改代码缓冲器中的并发内联代码的副本的时间而指定的调度,专用线程可调用处理器上的指令高速缓存刷新(例如,使得指令高速缓存清空)。
在刷新指令高速缓存之后,利用代码缓冲器中的所更新的常量参数修改的并发内联代码可被调用以替代先前作为针对源代码块的编译代码执行的并发内联代码。在一些实施例中,可在执行代码缓冲器中的并发内联代码时提供空白的新代码缓冲器。
如果串行内联高速缓存代码的所更新的常量参数或并发内联高速缓存代码的所更新的常量参数对应于匹配对象的动态类型的对象类型,则可执行快速代码路径以访问该对象。
图10为示出了用于基于具有索引标号的对象模型借助内联高速缓存并发访问对象的属性值来动态编译函数代码块的过程的一个实施例的流程图。示例性过程1000可由包括图2的系统200的一些部件的处理逻辑部件来执行。在块1001处,过程1000的处理逻辑部件可经由初始线程来为函数编译串行内联高速缓存代码。可在源代码中指定该函数以用于访问对象。串行内联高速缓存代码可包括串行慢速代码路径和快速代码路径。
可执行串行慢速代码路径以经由可为慢速并且需要昂贵处理资源的表格查找操作或其他可适用搜索操作来执行对对象的访问。可执行快速代码路径以经由嵌入快速代码路径内的存储器地址经由直接存储器加载操作(例如,无需执行查找操作)来执行对对象的访问。
在块1003处,过程1000的处理逻辑部件可执行串行慢速代码路径以经由编译串行慢速代码路径的初始线经由过解译器来访问对象。可经由串行慢速代码路径的执行来对快速代码路径的存储器地址进行初始化。
在块1005处,响应于经由与初始线程分开的线程对函数的调用,过程1000的处理逻辑部件可针对源代码中指定的函数编译并发内联高速缓存代码。并发内联高速缓存代码可包括嵌入有经由串行慢速代码路径的执行而初始化的存储器地址的快速代码路径。
在一个实施例中,并发内联高速缓存代码可具有并发慢速代码路径以用于经由表格查找操作来访问对象。并发内联高速缓存代码可包括指令以确定是否经由并发慢速代码路径或快速代码路径来执行对对象的访问。
在块1007处,过程1000的处理逻辑部件可经由一个或多个线程来执行并发内联高速缓存代码以执行该函数而无需调用解译器。如果执行并发内联高速缓存代码的并发慢速代码路径,则可重新初始化快速代码路径中的存储器地址。
用于动态类型化对象模型的平面阵列类型
在一个实施例中,平面阵列对象或内联存储阵列数据对象可基于针对在动态编程语言中指定的动态类型化对象的对象单元。对象单元可分配有在分配时识别的固定尺寸。例如,对象单元可包括例如在序列中彼此相邻或靠近的类型指针(例如,8字节)、数据指针(例如,8字节)和所分配的可选内联存储装置(例如,64位或其他固定尺寸位的存储空间)。内联存储装置(或内联属性存储装置)可为被存储在对象单元中的内联备份存储器。类型指针可指向表示对象类型的类型结构。数据指针可指向存储结构(例如,备份存储器)以用于存储用于对象类型的属性值。
在一个实施例中,可基于分配对象单元时(例如,当在运行时期间产生对应对象时)的存储器分配的状态来确定可选存储装置。可基于已分配的相邻对象单元之间的可用存储空间来确定可选存储装置。
用于动态编程语言的平面阵列对象可提供有功能以在运行时期间检测表示具有尺寸限制内的固定尺寸的阵列数据的对象的存在(例如,贯穿对象的生命周期)。例如,尺寸限制可根据用于表示动态类型对象的分配(例如,存储装置或存储器分配)来预先指定或确定。
阵列类型的阵列或数据可包括元素(值或变量)的集合,每个元素由可在运行时计算的一个或多个索引(识别键)来选择。阵列可包括经由阵列数据结构分配的矢量和/或矩阵。阵列数据结构可被分配以在某位置(存储器位置)处存储每个元素,该位置可经由数学公式从其索引诸如相对于用于存储阵列的第一元素的存储器地址的偏移量计算得到。
JavaScript中的许多阵列可贯穿其生命周期具有固定尺寸。例如,当阵列文字(例如,['hello',1,{}])在运行时被首次产生以及在该方式下产生的许多阵列在程序中其生命周期未生长时,它们可具有已知尺寸。另外,可基于配置文件机制(例如,经由图2的运行时数据211中收集的配置文件数据)来检测阵列在某长度内生长(或从不生成超过某长度)。对于从不生长超过某固定尺寸的阵列,可沿阵列自身的对象单元的侧面分配用于存储阵列的索引数据的备份存储器。
在一些实施例中,可执行代码诸如字节代码或编译代码可包括经由索引i、元素x的值和用于标引阵列配置文件对象的额外指针表示阵列a[i]=x的元素的阵列访问代码。当执行阵列访问代码时,阵列配置文件可累积元素值(例如,x)的类型信息以为该阵列建立运行时配置文件。
可分配平面阵列对象而无需分配对应存储结构以存储属性值(即,索引数据)。因此,相比较经由存储结构表示索引数据的对象的所需存储器分配的数量,可减少(例如,减少一半)表示运行时期间的索引数据的平面阵列对象的所需存储器分配的数量。
在一个实施例中,表示索引数据的平面阵列对象可允许运行时优化来编译(例如,经由JIT编译器)经由平面阵列对象访问或对索引数据执行操作的代码。编译代码可仅在平面阵列对象上操作。
例如,运行时诸如图2的并发代码执行模块217可执行直接加载以从表示索引数据的平面阵列对象的内联备份存储器访问索引数据。相比较通过经由对象的对象单元数据的指针加载存储结构来间接访问对象数据以及随后从存储结构(或备份存储器)加载值或数据,平面阵列对象可允许用于基于动态语言来访问动态类型化对象的性能优化,以实现在较低水平或类型化语言诸如像C语言中的阵列性能的接近对等的效果。
在一个实施例中,索引数据或阵列数据可被存储在结构化蝶形存储装置中,从而以双向方式来管理对象(例如,JavaScript对象)的属性值。存储对象的属性值的存储结构可基于蝶形存储装置。
例如,可具有可添加到动态类型化对象(例如,JavaScript对象)的两种类型的属性:索引属性和非索引属性。索引属性可包括具有名称的属性,该属性可为大于或等于0的整数。非索引属性可包括具有名称的属性,该属性为有效标识符,如ECMA(Ecma国际信息通信技术和消费电子产品)规范所定义的“foo”和“bar”。不同类型的属性可被存储在蝶形存储装置中的不同位置,以允许用于访问的统一方式。
在一个实施例中,对象的索引属性(或索引属性的属性值)可被存储在蝶形存储装置中的开始于蝶形存储装置中部的存储器单元的0索引序列中。对象的非索引属性(或非索引属性的属性值)可被存储在从蝶形存储装置中部向后延伸的0索引序列中。在一些实施例中,来自数据单元的表示对象的数据指针可指向蝶形存储装置的索引部分的第0个条目处。
被存储在存储器中的蝶形存储装置中的属性(或属性值)的布局可被表示为:
其中pN表示偏移量N处的非索引属性,并且ipN表示偏移量N处的索引属性。对象单元中的表示这些属性的对象的数据指针可指在蝶形存储装置中的存储器地址^(例如,ip0的地址)处。如果对象不具有索引属性,则布局可被表示为:
其中数据指针指在经过所分配的蝶形存储装置的末尾的存储器地址处(或存储p0的位置的末尾处)。类似地,如果对象不要求用于非索引属性的存储装置,则属性在蝶形存储装置中的布局可被表示为:
在一些实施例中,对象可将属性内联存储在表示对象的对应对象单元的内联存储装置中。内联存储装置可包括蝶形存储装置。对象单元中的数据指针(或蝶形指针)可指向经过对象单元中的该内联存储装置(或存储器段)的末尾。
根据某些实施例,表示动态类型化对象的对象单元可包括16个字节(或其他可适用尺寸)的存储区域。对象单元的前8个字节可包括指向类型结构的指针,该指向类型结构的指针可对应于指向其的对象的类型/形状的抽象。当程序(例如,基于JavaScript或动态语言)运行并且改变使用的对象时,可构建并修改结构或类型结构。类型结构可将非索引属性名映射到其对应偏移量。
16字节单元的后8个字节可为指向二级结构或存储结构诸如蝶形存储装置的指针或数据指针。紧接对象单元中的数据指针或在其之后,可分配用于内联非索引属性存储装置的可选数量的64位值。因此,基于JavaScript(或其他可适用动态语言)的对象的对象单元可具有如下表示的存储器布局(假定64位字长):
结构指针可为位置相对于对象单元偏移0个字节的类型指针;蝶形指针可为位置偏移8个字节的数据指针;并且可选内联属性存储装置的位置偏移16个字节。可访问被存储在内联存储装置内的属性值而无需经由蝶形指针的多余间接访问。
在一个实施例中,索引类型例如可作为位字段被保持在与对象相关联的存储结构中。对象的索引类型可指示被存储在其备份存储器或存储结构中的属性值的类型,诸如32位整型、双精度型、“其他”或其他可适用值类型。没有已知类型的属性值可分配有类型“其他”。
索引类型可指示存储结构的形状。例如,属性值可在形状Contiguous的存储结构中被安排在连续存储器空间中。可选地或作为另外一种选择,索引属性值可作为数据阵列被存储在形状ArrayStorage的存储结构中。
在一个实施例中,索引类型可指示对象的属性值是否包括阵列数据(例如,用于阵列对象的阵列类型)或非阵列数据(用于非阵列对象的非阵列类型)。另外,索引类型可指示对象是否为平面阵列对象。例如,索引类型可根据索引属性是否为内联存储来提供具有索引属性的对象是否为例如平面阵列类型的平面阵列对象的指示。换句话讲,索引类型指示阵列对象是否为平面阵列对象。
阵列访问或分配站点(或代码位置)可包括对应配置文件数据结构,以用于记录在运行时遇到的阵列或阵列对象上的运行时配置文件数据,诸如图2的运行时数据211中的配置文件数据。在一个实施例中,在运行时配置文件数据中收集遇到的阵列对象的索引类型。
在一个实施例中,包括索引类型的配置文件数据可允许运行时优化。例如,优化编译器的类型系统可允许推理遇到的阵列对象的形状(或类型诸如平面阵列类型)。编译器可将运行时校验插入编译的可执行代码以确保基于平面阵列对象假设所生成的代码在平面阵列类型的对象上操作。
另外,由于“平面”理念现在为编译器类型系统的一部分,所以其可提升(或优化)热循环(例如,重复或迭代执行的指令)中的这些运行时校验,以例如使执行程序所花费的时间或所需的存储空间最小化。编译器类型系统可包括为各个结构-诸如变量、表达式、函数或程序模块分配类型的规则的集合。编译器还可使用该类型信息(例如,对象是否为平面阵列对象)来生成具有内联存储阵列数据的优势的代码,以减少运行时存储器分配的次数、去除间接存储器加载等。
图11示出了针对平面阵列对象支持阵列数据存储内联的对象模型的实例。实例1100可包括例如基于图2的系统200的一些部件提供的示例性对象模块。例如,对象单元1105、1107可在存储器中连续分配,以表示运行时诸如图2的运行时211中的单独对象。对象单元1105可包括类型指针(或结构指针)1109(例如,8个字节)、数据(或值)指针1111(例如,8个字节)以及可选内联存储装置1113。对象单元1107可包括具有如类型指针1109的常用尺寸的类型指针1115、具有如数据指针1111的常用尺寸的数据指针1121和尺寸不同于内联存储装置1113的内联存储装置1123。
在一个实施例中,对象单元1105可表示具有内联存储在内联存储装置1113中的索引阵列数据的平面阵列对象。数据阵列1111可指向内联存储装置1113处,以允许其自身直接访问对象单元1105内的阵列数据而无需对存储器加载的间接访问。内联存储装置1113可能未变大例如对象单元1107限定的尺寸。类型指针1109可指向用于存储在内联存储装置1113中存储的阵列数据的索引(或者偏移量)的类型结构1101处。在一些实施例中,类型结构1101可包括用于指示用于对应对象的平面阵列类型的索引类型字段1103。
对象单元1107可表示具有带有阵列数据和非阵列数据两者的属性的对象。例如,数据指针1121可具有与用于存储结构1117的结构数据地址1119对应的指针值。与对象单元1107相关联的非阵列属性值P0、P1...PN和阵列属性值IP0、IP1...IPM可以蝶形双向方式被分配在存储结构1117中。
图12为示出了用于优化动态编程语言中指定的对象数据访问的动态分配的阵列数据内联的系统的一个实施例的框图。系统1200可包括图2的系统200的一些部件。例如,编译器205可包括解析器模块1205以对源代码(诸如,JavaScript代码)执行句法分析或静态分析,例如代码的元素之间的属性或句法关系。句法分析可例如基于属性值的类型(整型、字符串、文本、结构等)或源代码的其他可适用的句法结构来识别潜在阵列对象。在一些实施例中,可基于句法分析的结果来确定用于阵列对象(或阵列数据)的阵列数据的最大长度。
编译器205可包括对象类型预测器模块1207以例如基于运行时配置文件1209中的配置文件数据和/或用户输入来动态推断运行时对象的可能的类型。可在程序执行期间例如在图2的运行时数据211中连续收集运行时配置文件1209。用户输入可包括针对某些动态类型化对象的以编程方式接收的或经由有关可能类型的用户界面机制的暗示或启发式输入。
在一个实施例中,优化的阵列对象处理程序模块209可例如基于来自对象类型预测器1207的类型预测信息来动态识别平面阵列对象。可例如经由常规阵列代码生成模块1201来生成用于访问不是平面阵列对象的阵列对象的优化代码。长度短或有限的阵列数据诸如平面阵列对象可基于从平面阵列代码生成器模块1203生成的代码,以从对应对象单元的内联存储装置直接访问。
图13为示出了动态编译代码以分配阵列数据内联的过程的一个实施例的流程图。示例性过程1300可由例如包括图2的系统200的一些部件的处理逻辑部件来执行。在块1301处,过程1300的处理逻辑部件可在存储器中提供对象模型以用于执行基于动态语言的程序。对象模型可表示利用动态编程语言的源代码中的一个或多个属性指定的对象。每个属性可具有与属性值相关联的属性名。
对象模型可包括在存储器中分配的对象单元。对象单元可包括值指针(或数据指针)和内联存储装置。值指针可包括对被存储在于存储器中分配的值存储装置中的属性值的标引。对象的属性可具有用于表示数据阵列的阵列关系。
例如,对象可与经由编译器诸如图2的编译器205可识别的索引类型(或索引类型)相关联。索引类型可指示对象属于哪个有限(例如,预先确定的)数量的对象类型。每个对象类型可例如经由代码优化和/或生成的编译器中的类型系统在语义上与编译器相关联。
过程1300的处理逻辑部件可在运行时期间识别对象的类型。对象的类型可经由包括针对对象分配的对象单元的对象模块来存储。例如,对象的类型可为用于指示对象是否为阵列对象或非阵列对象以及如果对象为阵列对象则该对象是否为平面阵列对象的索引类型。
过程1300的处理逻辑部件可根据对象属性中的阵列关系的存在来确定对象是否为阵列对象。例如,具有阵列关系的对象的属性的每个属性名可被指定为表示源代码中的阵列索引。
在一个实施例中,对象中的阵列关系的存在可基于程序源和/或执行运行时分析机制来识别。例如,对源代码的静态分析可指示对象的属性名对应于可表示阵列索引的整数值。
如果对象为阵列对象并且对象单元的内联存储装置具有足够的空间(例如,存储器或存储空间)用于存储对象的属性值或阵列数据,则对象的索引类型可指示平面阵列对象。在一个实施例中,对象单元中的内联存储装置可被可用存储空间限定在所分配的相邻对象单元之间并且不会任意变大。如果附加阵列元素添加(例如,在运行时)到对象属性并且存储整个属性阵列和附加阵列元素所需的空间超过对应对象单元中的内联存储装置的可用容量,则现有平面阵列对象可成为非平面阵列对象。
在块1303处,过程1300的处理逻辑部件可确定内联存储装置是否具有足够的空间用于值存储装置来存储属性值。例如,用于存储数据阵列的存储空间的的大小可取决于阵列的长度(例如,索引最大值)以及用于每个阵列元素的值类型。过程1300的处理逻辑部件可基于添加到表示索引阵列的对象的属性值的数量来动态检测阵列的长度。
在块1305处,过程1300的处理逻辑部件可确定是否分配值存储装置来存储属性值,诸如对应于对象的对象单元的内联存储装置内的或对象单元外部的对象的阵列数据。例如,如果内联存储装置具有足够的空间用于值存储装置,则属性值被存储在内联存储装置中。如果内联存储装置的尺寸小于存储属性值所需的尺寸,则属性值可被存储在对象单元外部或外部存储装置中。可在例如更新现有平面阵列对象的索引类型以指示对象不再为平面阵列类型时分配用于存储索引阵列或数据阵列的外部存储装置。
在一个实施例中,如果与针对阵列关系的边界外索引值对应的所更新的属性名与平面阵列对象相关联,则可更新平面阵列对象的索引类型以指示该对象为阵列对象但不是平面阵列对象。边界外索引值可指示例如针对平面阵列对象的对象单元的内联存储装置没有足够的空间来存储边界外索引值的阵列长度的属性值阵列。
在一个实施例中,与对象相关联的对象单元可包括用于标引存储对象的现有属性名而分配的结构存储装置的类型指针。在运行时期间,对具有附加属性名的对象的访问可使得属性指针被更新以指代(例如,指向)存储现有属性名和附加属性名的副本的单独结构存储装置。类型指针可表示在基于动态类型化编程语言的源代码中指定的对象的动态类型。对象的索引类型可被存储在类型指针、由类型指针标引的类型结构、或与对象的对象单元相关联的字段中。
在块1307处,过程1300的处理逻辑部件可生成指令以用于对在源代码中指定的对象的属性值的访问。在一个实施例中,指令可包括保护代码、快速代码路径和慢速代码路径。可执行慢速代码路径以定位将属性值存储在表示对象的对象单元外的值存储装置。例如,慢速代码路径可要求经由对象单元的值指针或数据指针的间接存储器加载以执行对属性值的访问。可执行快速代码路径来访问对象单元内的属性值,而无需经由值指针来间接定位值存储装置。
在一个实施例中,可执行保护代码以动态确定是否调用慢速代码路径或快速代码路径以用于访问对象的属性值。例如,如果属性值具有阵列关系并且表示对象的对象单元的内联存储装置具有足够的空间作为值存储装置来存储属性值,则可调用快速代码路径。
在某些实施例中,是否调用快速代码可基于对象的索引类型。例如,如果对象的索引类型指示对象为平面阵列对象,则可经由保护代码来调用快速代码路径。用于访问对象的属性值的动态生成的指令可包括存储器加载操作以经由被存储在表示对象的对象单元中的值指针访问属性值。如果对象为平面阵列对象,则可执行指令来定位属性值(例如,被存储在值存储装置中)而无需经由值指针(例如直接从对象单元内)执行加载操作。
在一个实施例中,可在源代码中指定用于访问对象的循环(例如,与矩阵操作、矢量操作,或其他迭代操作相关联)。循环可包括对对象的属性值的多次访问。如果对象的索引类型指示该对象为平面阵列对象,则针对对象的多次访问生成的指令可得到优化以包括一个常见保护代码,从而确定是否调用在对象单元内的对对象的多次直接访问的每次访问的快速代码路径,而不包括循环中的对对象的每次访问的单独保护代码。
图14为示出了用于在运行时期间识别平面阵列数据类型以生成指令以用于经由平面阵列分配的内联迭代地访问对象的过程的一个实施例的流程图。示例性过程1400可由例如包括图2的系统200的一些部件的处理逻辑部件来执行。在块1401处,在运行时期间在存储器中提供对象模型,该对象模型表示在源代码中由一个或多个属性指定的对象,每个属性具有与属性值相关联的属性名,对象模型包括在存储器中分配的对象单元,该对象单元具有属性指针、值指针和内联存储装置,该值指针指向被分配用于存储属性值的值存储装置,该属性指针指向被分配用于存储属性名的属性存储装置。
在块1403处,在运行时期间识别对象的平面阵列类型,其中平面阵列类型指示该对象表示阵列结构,对象的每个属性名对应于阵列结构的索引,对象的每个属性值对应于阵列结构的索引值,其中阵列结构在运行时期间具有有限长度,并且其中阵列结构被分配在用于值存储装置的对象单元的内联存储装置内。
在块1405处,生成用于在源代码中指定的对象的迭代访问的指令,其中对象的迭代访问对应于对对象的单独属性值的多次访问,其中指令包括保护代码、慢速代码路径和多个快速代码路径,该慢速代码路径经由值指针定位值存储装置来把值存储装置定位在对象单元之外以执行属性值的迭代访问,该快速代码路径在对象单元内执行对单独属性值的多次访问而无需检查对象的索引类型,该保护代码确定是否调用慢速代码路径或快速代码路径以用于对对象的迭代访问,其中如果识别出对象的平面阵列类型,则调用快速代码路径。
图15示出了数据处理系统诸如计算机系统的一个实例,该数据处理系统可与本发明的一个实施例一起使用。例如,系统1500可被实现为图1所示的系统的一部分。需注意,虽然图15示出了计算机系统的各种部件,但是其并不旨在表示使这些部件互连的任何特定构造或方式,因此此类细节与本发明并无密切关系。还应理解,具有较少部件或可能较多部件的网络计算机以及其他数据处理系统也可用于本发明。
如图15所示,数据处理系统形式的计算机系统1500包括耦接到一个或多个微处理器1505、ROM(只读存储器)1507、易失性RAM 1509和非易失性存储器1511的总线1503。微处理器1505可从存储器1507,1509,1511检索指令并执行该指令以执行上述操作。总线1503与这些各种部件互连在一起,并且将这些部件1505,1507,1509和1511互连至显示控制器和显示设备1513并且将这些部件互连至外围设备诸如输入/输出(I/O)设备,该输入/输出(I/O)设备可以是鼠标、键盘、调制解调器、网络接口、打印机和本领域熟知的其他设备。通常,输入/输出设备1515通过输入/输出控制器1517耦接到系统。易失性RAM(随机存取存储器)1509通常被实现为需要连续供电以刷新或保持存储器中的数据的动态RAM(DRAM)。
海量存储装置1511通常为磁性硬盘驱动器或磁性光驱或光驱或DVD RAM或闪存存储器或者即使在系统断电后也保持数据(例如,大量数据)的其他类型的存储器系统。通常,海量存储装置1511也可以是随机存取存储器,虽然这并非是必需的。虽然图15显示海量存储装置1511为直接耦接到数据处理系统中的其余部件的本地设备,但应当理解,本发明可利用远离系统的非易失性存储器,诸如通过网络接口诸如调制解调器或以太网接口或无线网络接口耦接到数据处理系统的网络存储设备。总线1503可包括通过本领域熟知的各种桥接器、控制器和/或适配器相互连接的一条或多条总线。
上述内容的部分可使利用辑电路诸如专用逻辑电路来实现,或利用微控制器或用于执行程序代码指令的其他形式的处理核心来实现。从而,可利用程序代码诸如机器可执行指令来执行上述讨论所教导的过程,该机器可执行指令使得机器执行这些指令以执行某些函数。在该上下文中,“机器”可为将中间形式(或“抽象”)指令转换为特定于处理器的指令(例如,抽象执行环境诸如“虚拟机”(例如,Java虚拟机)、解译器、公共语言运行时、高级语言虚拟机等)的机器,和/或被设置在半导体芯片(例如,利用晶体管实现的“逻辑电路”)上的电子电路,该电子电路被设计用于执行指令,该处理器诸如通用处理器和/或专用处理器。上述讨论所教导的过程也可通过(作为机器的替代或与机器结合)电子电路来执行,该电子电路被设计用于执行过程(或其一部分)而不执行程序代码。
制品可用于存储程序代码。存储程序代码的制品可被实施为但不限于一个或多个存储器(例如,一个或多个闪存存储器、随机存取存储器(静态、动态或其他))、光盘、CD-ROM、DVD ROM、EPROM、EEPROM、磁卡或光卡、或适用于存储电子指令的其他类型的机器可读介质。也可借助被包含在传播介质(例如,经由通信链路(例如网络连接))中的数据信号来将程序代码从远程计算机(例如,服务器)下载到请求计算机(例如,客户端)。
已按照对计算机存储器内的数据位进行操作的算法和符号表示来呈现前面的详细描述。这些算法描述和表示是数据处理领域的技术人员所使用的工具,而这些工具也能最有效地将其工作实质传达给该领域的其他技术人员。算法在这里并通常是指导致所希望的结果的操作的自相一致的序列。操作是需要对物理量进行物理操纵的那些操作。通常,尽管不是必须的,但这些量采用能够被存储、传送、组合、比较以及换句话讲操纵的电信号或磁信号的形式。已被证明其在主要出于通用原因而将这些信号指代为位、值、元素、符号、字符、术语、数字等时是方便的。
然而,应当牢记的是,所有这些以及类似的术语都与适当的物理量相关联,并且其只是应用于这些量的方便标签。除非另外特别说明,否则从上述讨论中显而易见的是,可以理解,在整个说明书中,使用术语诸如“处理”或“运算”或“计算”或“确定”或“显示”等的讨论是指对计算机系统或类似的电子计算设备的行动和处理,这些设备可对计算机系统的寄存器和存储器中表示为物理(电子)量的数据进行操纵,并将其转换成在计算机系统存储器或寄存器或其他此类信息存储、传输或显示设备中相似地表示为物理量的其他数据。
本发明还涉及一种用于执行本文所述的操作的装置。该装置可专门构造用于所需的目的,或者其可包括由被存储在计算机中的计算机程序选择性地激活或重新配置的通用计算机。此类计算机程序可被存储在计算机可读存储介质中,例如但不限于任何类型的盘,包括软盘、光盘、CD-ROM和磁光盘,只读存储器(ROM)、RAM、EPROM、EEPROM、磁卡或光卡、或适用于存储电子指令的任何类型的介质,并且每一者均耦接到计算机系统总线。
本文中所呈现的过程和显示并不固有地与任何特定计算机或其他装置相关。根据本文的教导内容,各种通用系统可与程序一起使用,或者可证明其便于构造用于执行所述操作的更专用的装置。根据下文的描述,用于各种这些系统的所需结构将是显而易见的。此外,本发明未参照任何特定的编程语言进行描述。应当理解,多种编程语言可用于实现如本文所述的本发明的教导内容。
前面的讨论仅描述了本发明的一些示例性实施例。本领域的技术人员将易于从此类讨论、附图和权利要求书中认识到,可在不脱离本发明的实质和范围的情况下进行各种修改。
Claims (43)
1.一种数据处理系统,包括:
用于从源代码的源代码块生成初始内联代码的装置,所述源代码块指定对对象的至少一次访问,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问;
用于从所述源代码块生成并发内联代码的装置,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
用于经由特定线程来执行所述初始内联代码以执行对所述对象的所述至少一次访问的装置,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数;和
用于并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问的装置,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数,
其中如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数对应于匹配所述对象的类型的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
2.根据权利要求1所述的系统,其中所述初始内联代码包括用于抑制所述一个或多个线程执行所述串行内联高速缓存代码的保护代码。
3.根据权利要求2所述的系统,其中经由所述特定线程来生成所述初始内联代码,并且其中所述保护代码将确定是否由所述特定线程来执行所述初始内联代码。
4.根据权利要求3所述的系统,其中作为经由所述一个或多个线程中的一个线程来执行所述保护代码以确定所述初始内联代码未由所述特定线程执行的结果,经由所述一个线程来生成所述并发内联代码。
5.根据权利要求4所述的系统,其中从所述初始内联代码生成所述并发内联代码,并且其中生成所述并发内联代码将所述保护代码修补作为无操作代码以允许线程执行所述并发内联高速缓存代码,而与所述线程的身份无关。
6.根据权利要求1所述的系统,其中经由解译器来执行所述串行慢速代码路径以更新用于对所述快速代码路径进行初始化的常量参数,并且其中所述解译器在多个处理器间调用数据一致性机制以共享经初始化的快速代码路径,而不在所述多个处理器间调用指令一致性机制。
7.根据权利要求6所述的系统,其中所述串行慢速代码路径包括将由所述解译器执行的表格查找操作。
8.根据权利要求6所述的系统,其中所述并发慢速代码路径包括将独立于所述解译器执行的表格查找操作。
9.根据权利要求1所述的系统,其中在生成所述并发内联代码之前经由所述特定线程来更新所述串行内联高速缓存代码的所述参数,并且其中根据所述串行内联高速缓存代码的所更新参数来生成所述并发内联高速缓存代码。
10.根据权利要求1所述的系统,其中所述参数被表示为汇编代码常量。
11.根据权利要求10所述的系统,其中所述并发内联代码的副本被存储在代码缓冲器中,并且其中经由所述自修改代码对所述参数的更新利用所更新的参数来修改所述并发内联代码在所述代码缓冲器中的所述副本,其中所述并发内联代码的所述副本与所述一个或多个线程间的所述并发内联代码的执行异步地被修改。
12.根据权利要求11所述的系统,其中所述并发内联代码由能够进行指令高速缓存的至少一个处理器来执行,并且经由专用线程来刷新所述至少一个处理器的指令高速缓存,其中根据调度来刷新所述指令高速缓存。
13.根据权利要求12所述的系统,其中在刷新所述指令高速缓存之后,调用所述代码缓冲器中的利用所更新的参数所修改的并发内联代码,以替代先前作为针对所述源代码块的编译代码的所述并发内联代码。
14.根据权利要求1所述的系统,其中所述源代码基于动态类型化编程语言,其中所述对象具有使一个或多个属性与对应属性值相关联的动态结构,并且其中所述对象的类型对应于所述动态结构。
15.根据权利要求14所述的系统,其中所述参数中的一个参数指示用于标引所述对象的所述动态结构的指针,所述指针表示所述对象的类型。
16.根据权利要求15所述的系统,其中对所述对象的访问包括经由存储器地址的对于所述属性值中的一个属性值的加载操作。
17.根据权利要求16所述的系统,其中所述一个属性值被存储在所述存储器地址中,并且其中所述参数中的一个参数具有与经由所述动态结构来定位所述存储器地址的偏移量对应的值。
18.根据权利要求16所述的系统,其中如果所述参数中的所述指针不指代所述对象的所述动态结构,则经由表格查找操作来确定用于所述加载操作的所述存储器地址。
19.一种数据处理系统,包括:
用于经由初始线程来编译函数的串行内联高速缓存代码的装置,所述函数在源代码中被指定以用于访问对象,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行慢速代码路径经由表格查找操作来执行对所述对象的所述访问,所述快速代码路径经由嵌入所述快速代码路径中的存储器地址经由直接存储器加载操作来执行对所述对象的访问,所述串行慢速代码路径包括自修改代码用于更新所述存储器地址;
用于通过所述初始线程经由解译器来执行所述串行慢速代码路径以访问所述对象的装置,其中在所述串行慢速代码路径的执行中经由所述自修改代码来对所述快速代码路径的所述存储器地址进行初始化;
用于响应于经由与所述初始线程分开的线程对所述函数的调用来编译所述函数的并发内联高速缓存代码的装置,所述并发内联高速缓存代码包括具有经由所述串行慢速代码路径的执行而初始化的所述存储器地址的所述快速代码路径,所述并发内联高速缓存代码具有并发慢速代码路径以用于经由所述表格查找操作对所述对象的访问,所述并发内联高速缓存代码确定经由所述并发慢速代码路径还是所述快速代码路径来执行对所述对象的所述访问;和
用于经由一个或多个线程来执行所述并发内联高速缓存代码以执行所述函数而不调用所述解译器的装置,其中如果执行所述并发内联高速缓存代码的所述并发慢速代码路径,则重新初始化所述快速代码路径的存储器地址。
20.一种数据处理方法,包括:
从源代码的源代码块生成初始内联代码,所述源代码块指定对对象的至少一次访问,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问;
从所述源代码块生成并发内联代码,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
经由特定线程来执行所述初始内联代码以执行对所述对象的所述至少一次访问,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数;
并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数;以及
如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数表示匹配所述对象的类型的更新的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
21.一种数据处理系统,包括:
存储器,所述存储器存储指令和源代码以执行数据处理任务,所述源代码包括用于指定对对象的至少一次访问的源代码块;和
处理器,所述处理器耦接到所述存储器以执行来自所述存储器的所述指令,所述处理器被配置为
从所述源代码块生成初始内联代码,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问,
从所述源代码块生成并发内联代码,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
经由特定线程执行所述初始内联代码以执行对所述对象的所述至少一次访问,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数,
并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数;以及
如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数表示匹配所述对象的类型的更新的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
22.一种数据处理方法,包括:
从源代码的源代码块生成初始内联代码,所述源代码块指定对对象的至少一次访问,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问;
从所述源代码块生成并发内联代码,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
经由特定线程来执行所述初始内联代码以执行对所述对象的所述至少一次访问,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数;和
并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数,
其中如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数对应于匹配所述对象的类型的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
23.根据权利要求22所述的方法,其中所述初始内联代码包括用于抑制所述一个或多个线程执行所述串行内联高速缓存代码的保护代码。
24.根据权利要求23所述的方法,其中经由所述特定线程来生成所述初始内联代码,并且其中所述保护代码将确定是否由所述特定线程来执行所述初始内联代码。
25.根据权利要求24所述的方法,其中作为经由所述一个或多个线程中的一个线程来执行所述保护代码以确定所述初始内联代码未由所述特定线程执行的结果,经由所述一个线程来生成所述并发内联代码。
26.根据权利要求25所述的方法,其中从所述初始内联代码生成所述并发内联代码,并且其中生成所述并发内联代码将所述保护代码修补作为无操作代码以允许线程执行所述并发内联高速缓存代码,而与所述线程的身份无关。
27.根据权利要求22所述的方法,其中经由解译器来执行所述串行慢速代码路径以更新用于对所述快速代码路径进行初始化的常量参数,并且其中所述解译器在多个处理器间调用数据一致性机制以共享经初始化的快速代码路径,而不在所述多个处理器间调用指令一致性机制。
28.根据权利要求27所述的方法,其中所述串行慢速代码路径包括将由所述解译器执行的表格查找操作。
29.根据权利要求27所述的方法,其中所述并发慢速代码路径包括将独立于所述解译器执行的表格查找操作。
30.根据权利要求22所述的方法,其中在生成所述并发内联代码之前经由所述特定线程来更新所述串行内联高速缓存代码的所述参数,并且其中根据所述串行内联高速缓存代码的所更新的参数来生成所述并发内联高速缓存代码。
31.根据权利要求22所述的方法,其中所述参数被表示为汇编代码常量。
32.根据权利要求31所述的方法,其中所述并发内联代码的副本被存储在代码缓冲器中,并且其中经由所述自修改代码对所述参数的更新利用所更新的参数来修改所述并发内联代码在所述代码缓冲器中的所述副本,其中所述并发内联代码的所述副本与所述一个或多个线程间的所述并发内联代码的执行异步地被修改。
33.根据权利要求32所述的方法,其中所述并发内联代码由能够进行指令高速缓存的至少一个处理器来执行,并且经由专用线程来刷新所述至少一个处理器的指令高速缓存,其中根据调度来刷新所述指令高速缓存。
34.根据权利要求33所述的方法,其中在刷新所述指令高速缓存之后,调用所述代码缓冲器中的利用所更新的参数所修改的并发内联代码,以替代先前作为针对所述源代码块的编译代码的所述并发内联代码。
35.根据权利要求22所述的方法,其中所述源代码基于动态类型化编程语言,其中所述对象具有使一个或多个属性与对应属性值相关联的动态结构,并且其中所述对象的类型对应于所述动态结构。
36.根据权利要求35所述的方法,其中所述参数中的一个参数指示用于标引所述对象的所述动态结构的指针,所述指针表示所述对象的类型。
37.根据权利要求36所述的方法,其中对所述对象的访问包括经由存储器地址的对于所述属性值中的一个属性值的加载操作。
38.根据权利要求37所述的方法,其中所述一个属性值被存储在所述存储器地址中,并且其中所述参数中的一个参数具有与经由所述动态结构来定位所述存储器地址的偏移量对应的值。
39.根据权利要求38所述的方法,其中如果所述参数中的所述指针不指代所述对象的所述动态结构,则经由表格查找操作来确定用于所述加载操作的所述存储器地址。
40.一种数据处理系统,包括:
存储器,所述存储器存储指令和源代码以执行数据处理任务,所述源代码包括用于指定对对象的至少一次访问的源代码块;和
处理器,所述处理器耦接到所述存储器以执行来自所述存储器的所述指令,所述处理器被配置为
从源代码的源代码块生成初始内联代码,所述源代码块指定对对象的至少一次访问,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问;
从所述源代码块生成并发内联代码,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
经由特定线程来执行所述初始内联代码以执行对所述对象的所述至少一次访问,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数;和
并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数,
其中如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数对应于匹配所述对象的类型的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
41.一种数据处理方法,包括:
经由初始线程来编译函数的串行内联高速缓存代码,所述函数在源代码中被指定以用于访问对象,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行慢速代码路径经由表格查找操作来执行对所述对象的所述访问,所述快速代码路径经由嵌入所述快速代码路径中的存储器地址经由直接存储器加载操作来执行对所述对象的访问,所述串行慢速代码路径包括自修改代码用于更新所述存储器地址;
通过所述初始线程经由解译器来执行所述串行慢速代码路径以访问所述对象,其中在所述串行慢速代码路径的执行中经由所述自修改代码来对所述快速代码路径的所述存储器地址进行初始化;
响应于经由与所述初始线程分开的线程对所述函数的调用来编译所述函数的并发内联高速缓存代码,所述并发内联高速缓存代码包括具有经由所述串行慢速代码路径的执行而初始化的所述存储器地址的所述快速代码路径,所述并发内联高速缓存代码具有并发慢速代码路径以用于经由所述表格查找操作对所述对象的访问,所述并发内联高速缓存代码确定经由所述并发慢速代码路径还是所述快速代码路径来执行对所述对象的所述访问;
和
经由一个或多个线程来执行所述并发内联高速缓存代码以执行所述函数而不调用所述解译器,其中如果执行所述并发内联高速缓存代码的所述并发慢速代码路径,则重新初始化所述快速代码路径的存储器地址。
42.一种数据处理系统,包括:
存储器,所述存储器存储指令和源代码以执行数据处理任务,所述源代码包括用于指定对对象的至少一次访问的源代码块;和
处理器,所述处理器耦接到所述存储器以执行来自所述存储器的所述指令,所述处理器被配置为
经由初始线程来编译函数的串行内联高速缓存代码,所述函数在源代码中被指定以用于访问对象,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行慢速代码路径经由表格查找操作来执行对所述对象的所述访问,所述快速代码路径经由嵌入所述快速代码路径中的存储器地址经由直接存储器加载操作来执行对所述对象的访问,所述串行慢速代码路径包括自修改代码用于更新所述存储器地址;
通过所述初始线程经由解译器来执行所述串行慢速代码路径以访问所述对象,其中在所述串行慢速代码路径的执行中经由所述自修改代码来对所述快速代码路径的所述存储器地址进行初始化;
响应于经由与所述初始线程分开的线程对所述函数的调用来编译所述函数的并发内联高速缓存代码,所述并发内联高速缓存代码包括具有经由所述串行慢速代码路径的执行而初始化的所述存储器地址的所述快速代码路径,所述并发内联高速缓存代码具有并发慢速代码路径以用于经由所述表格查找操作对所述对象的访问,所述并发内联高速缓存代码确定经由所述并发慢速代码路径还是所述快速代码路径来执行对所述对象的所述访问;
和
经由一个或多个线程来执行所述并发内联高速缓存代码以执行所述函数而不调用所述解译器,其中如果执行所述并发内联高速缓存代码的所述并发慢速代码路径,则重新初始化所述快速代码路径的存储器地址。
43.一种数据处理系统,包括:
用于从源代码的源代码块生成初始内联代码的装置,所述源代码块指定对对象的至少一次访问,所述初始内联代码具有用于执行对所述对象的一次访问的串行内联高速缓存代码,其中所述串行内联高速缓存代码包括串行慢速代码路径和快速代码路径,所述串行内联高速缓存代码嵌入一个或多个参数以确定经由所述快速代码路径还是所述串行慢速代码路径来执行对所述对象的所述一次访问;
用于从所述源代码块生成并发内联代码的装置,所述并发内联代码具有用于执行对所述对象的所述一次访问的并发内联高速缓存代码,其中所述并发内联高速缓存代码包括并发慢速代码路径和所述快速代码路径,所述并发内联高速缓存代码嵌入所述参数以确定经由所述快速代码路径还是所述并发慢速代码路径来执行对所述对象的访问;
用于经由特定线程来执行所述初始内联代码以执行对所述对象的所述至少一次访问的装置,其中所述串行慢速代码路径包括自修改代码用于更新所述串行内联高速缓存代码的所述参数;
用于并发地经由一个或多个线程来执行所述并发内联代码以执行对所述对象的所述至少一次访问的装置,其中所述并发慢速代码路径包括自修改代码用于更新所述并发内联高速缓存代码的所述参数;以及
用于如果所述串行内联高速缓存代码的所更新的参数或所述并发内联高速缓存代码的所更新的参数表示匹配所述对象的类型的更新的对象类型,则执行所述快速代码路径以执行对所述对象的所述至少一次访问的装置,
其中所述初始内联代码由所述特定线程执行来初始化所述参数,并且
其中所述并发内联代码是在所述初始内联代码的所述执行之后被生成的。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201361872386P | 2013-08-30 | 2013-08-30 | |
US61/872,386 | 2013-08-30 | ||
US14/096,912 US9251071B2 (en) | 2013-08-30 | 2013-12-04 | Concurrent inline cache optimization in accessing dynamically typed objects |
US14/096,912 | 2013-12-04 | ||
PCT/US2014/052286 WO2015031192A1 (en) | 2013-08-30 | 2014-08-22 | Concurrent inline cache optimization in accessing dynamically typed objects |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105493041A CN105493041A (zh) | 2016-04-13 |
CN105493041B true CN105493041B (zh) | 2019-04-09 |
Family
ID=52584914
Family Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201480047215.7A Active CN105493041B (zh) | 2013-08-30 | 2014-08-22 | 在访问动态类型化对象过程中的并发内联高速缓存优化 |
CN201480047216.1A Active CN105493042B (zh) | 2013-08-30 | 2014-08-22 | 对动态类型化对象数据的并发访问 |
CN201480047213.8A Active CN105493040B (zh) | 2013-08-30 | 2014-08-25 | 在访问动态类型化阵列对象过程中的尺寸依赖类型 |
Family Applications After (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201480047216.1A Active CN105493042B (zh) | 2013-08-30 | 2014-08-22 | 对动态类型化对象数据的并发访问 |
CN201480047213.8A Active CN105493040B (zh) | 2013-08-30 | 2014-08-25 | 在访问动态类型化阵列对象过程中的尺寸依赖类型 |
Country Status (5)
Country | Link |
---|---|
US (3) | US9251071B2 (zh) |
EP (3) | EP3039535B1 (zh) |
KR (3) | KR101778479B1 (zh) |
CN (3) | CN105493041B (zh) |
WO (3) | WO2015031192A1 (zh) |
Families Citing this family (39)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10482194B1 (en) * | 2013-12-17 | 2019-11-19 | EMC IP Holding Company LLC | Simulation mode modification management of embedded objects |
US9104434B2 (en) * | 2013-12-20 | 2015-08-11 | Microsoft Technology Licensing, Llc | Property accesses in dynamically typed programming languages |
US9207914B2 (en) | 2013-12-20 | 2015-12-08 | Microsoft Technology Licensing, Llc | Execution guards in dynamic programming |
US9710388B2 (en) | 2014-01-23 | 2017-07-18 | Qualcomm Incorporated | Hardware acceleration for inline caches in dynamic languages |
US9740504B2 (en) * | 2014-01-23 | 2017-08-22 | Qualcomm Incorporated | Hardware acceleration for inline caches in dynamic languages |
US10776378B2 (en) * | 2014-07-09 | 2020-09-15 | Oracle Interntional Corporation | System and method for use of immutable accessors with dynamic byte arrays |
EP3086233B1 (en) * | 2015-04-23 | 2020-05-06 | CODESYS Holding GmbH | Method and system for measuring a runtime by means of watchpoints |
US10614126B2 (en) | 2015-05-21 | 2020-04-07 | Oracle International Corporation | Textual query editor for graph databases that performs semantic analysis using extracted information |
JP6603495B2 (ja) * | 2015-07-01 | 2019-11-06 | 株式会社Lixil | 抗菌・抗ウィルス性コーティング剤 |
US10127025B2 (en) * | 2015-07-22 | 2018-11-13 | Oracle International Corporation | Optimization techniques for high-level graph language compilers |
US10025582B2 (en) | 2015-12-10 | 2018-07-17 | International Business Machines Corporation | Applying program patch sets |
US9971570B2 (en) | 2015-12-15 | 2018-05-15 | Oracle International Corporation | Automated generation of memory consumption aware code |
CN106897051B (zh) * | 2015-12-24 | 2022-01-25 | 北京奇虎科技有限公司 | 一种进程清理的方法及装置 |
US11263110B1 (en) * | 2015-12-31 | 2022-03-01 | EMC IP Holding Company LLC | Inter-object validation system and method for the objects of a test system |
CN105912398A (zh) * | 2016-04-06 | 2016-08-31 | 北京小米移动软件有限公司 | 内存检测方法及装置 |
US9952982B2 (en) * | 2016-06-06 | 2018-04-24 | International Business Machines Corporation | Invoking demote threads on processors to demote tracks indicated in demote ready lists from a cache when a number of free cache segments in the cache is below a free cache segment threshold |
US9852202B1 (en) * | 2016-09-23 | 2017-12-26 | International Business Machines Corporation | Bandwidth-reduced coherency communication |
CN108920149B (zh) * | 2017-03-29 | 2020-12-08 | 华为技术有限公司 | 编译方法和编译装置 |
CN108694185B (zh) * | 2017-04-07 | 2021-06-04 | 成都阜特科技股份有限公司 | 一种数据存储与提取的方法 |
US10691609B2 (en) | 2017-07-24 | 2020-06-23 | International Business Machines Corporation | Concurrent data erasure and replacement of processors |
US10585945B2 (en) | 2017-08-01 | 2020-03-10 | Oracle International Corporation | Methods of graph-type specialization and optimization in graph algorithm DSL compilation |
US10866806B2 (en) * | 2017-11-14 | 2020-12-15 | Nvidia Corporation | Uniform register file for improved resource utilization |
CN108154463B (zh) * | 2017-12-06 | 2021-12-24 | 中国航空工业集团公司西安航空计算技术研究所 | 一种模型化gpu显存系统管理方法 |
CN108647241A (zh) * | 2018-04-09 | 2018-10-12 | 宁波诺信睿聚投资有限责任公司 | 数据存储方法、装置、计算机设备及计算机可读存储介质 |
US10552185B2 (en) | 2018-05-24 | 2020-02-04 | International Business Machines Corporation | Lightweight and precise value profiling |
CN110825531B (zh) * | 2018-08-14 | 2023-05-30 | 斑马智行网络(香港)有限公司 | 针对动态类型语言的优化方法、装置、设备以及存储介质 |
CN110908850A (zh) * | 2018-09-14 | 2020-03-24 | 阿里巴巴集团控股有限公司 | 数据获取方法及装置 |
CN109725955A (zh) * | 2018-12-30 | 2019-05-07 | 北京城市网邻信息技术有限公司 | 一种访问对象属性方法、装置、设备及存储介质 |
EP4042273A4 (en) | 2019-10-08 | 2023-06-21 | INTEL Corporation | REDUCING COMPILER TESTING COSTS THROUGH THREAD SPECULATION AND HARDWARE TRANSACTION MEMORY |
CN110753056B (zh) * | 2019-10-25 | 2022-05-13 | 高秀芬 | 一种非交互式加密访问控制方法 |
CN110825369A (zh) * | 2019-11-07 | 2020-02-21 | 四川长虹电器股份有限公司 | 一种基于java语言的代码自动生成的方法 |
US11188316B2 (en) | 2020-03-09 | 2021-11-30 | International Business Machines Corporation | Performance optimization of class instance comparisons |
US11275671B2 (en) * | 2020-07-27 | 2022-03-15 | Huawei Technologies Co., Ltd. | Systems, methods and media for dynamically shaped tensors using liquid types |
US11487565B2 (en) * | 2020-10-29 | 2022-11-01 | Hewlett Packard Enterprise Development Lp | Instances of just-in-time (JIT) compilation of code using different compilation settings |
US11307834B1 (en) * | 2020-11-11 | 2022-04-19 | Fileonq, Inc. | Platform for rapid application development |
CN112957068B (zh) * | 2021-01-29 | 2023-07-11 | 青岛海信医疗设备股份有限公司 | 超声信号处理方法及终端设备 |
US11940994B2 (en) * | 2021-10-29 | 2024-03-26 | Salesforce, Inc. | Mechanisms for maintaining chains without locks |
US20230229525A1 (en) * | 2022-01-20 | 2023-07-20 | Dell Products L.P. | High-performance remote atomic synchronization |
CN115373645B (zh) * | 2022-10-24 | 2023-02-03 | 济南新语软件科技有限公司 | 一种基于可动态定义的复杂数据包操作方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0806725A2 (en) * | 1996-05-07 | 1997-11-12 | Sun Microsystems, Inc. | Method and apparatus for easy insertion of assembler code for optimization |
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
Family Cites Families (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5915114A (en) * | 1997-02-14 | 1999-06-22 | Hewlett-Packard Company | Dynamic trace driven object code optimizer |
GB2377283B (en) * | 2001-04-10 | 2004-12-01 | Discreet Logic Inc | Initialising modules |
US7062761B2 (en) | 2001-07-10 | 2006-06-13 | Micron Technology, Inc. | Dynamic arrays and overlays with bounds policies |
US7010783B2 (en) * | 2002-03-18 | 2006-03-07 | Sun Microsystems, Inc. | Method and apparatus for deployment of high integrity software using reduced dynamic memory allocation |
US7805710B2 (en) | 2003-07-15 | 2010-09-28 | International Business Machines Corporation | Shared code caching for program code conversion |
EP1658563B1 (en) | 2003-08-28 | 2013-06-05 | MIPS Technologies, Inc. | Apparatus, and method for initiation of concurrent instruction streams in a multithreading microprocessor |
US7519639B2 (en) | 2004-01-05 | 2009-04-14 | International Business Machines Corporation | Method and apparatus for dynamic incremental defragmentation of memory |
US7526760B1 (en) | 2004-03-17 | 2009-04-28 | Sun Microsystems, Inc. | Methods for implementing virtual method invocation with shared code |
JP2005346407A (ja) | 2004-06-03 | 2005-12-15 | Hitachi Ltd | 動的コンパイルにおけるインライン展開実施方法 |
US20060242635A1 (en) * | 2005-04-21 | 2006-10-26 | Scott Broussard | Method and system for optimizing array sizes in a JAVA virtual machine |
US20080005728A1 (en) * | 2006-06-30 | 2008-01-03 | Robert Paul Morris | Methods, systems, and computer program products for enabling cross language access to an addressable entity in an execution environment |
US7761676B2 (en) | 2006-12-12 | 2010-07-20 | Intel Corporation | Protecting memory by containing pointer accesses |
US8146054B2 (en) | 2006-12-12 | 2012-03-27 | International Business Machines Corporation | Hybrid data object model |
US7975001B1 (en) | 2007-02-14 | 2011-07-05 | The Mathworks, Inc. | Bi-directional communication in a parallel processing environment |
US8001070B2 (en) | 2007-12-17 | 2011-08-16 | Honeywell International Inc. | Object oriented rule-based system and method |
US8392881B1 (en) | 2008-05-13 | 2013-03-05 | Google Inc. | Supporting efficient access to object properties in a dynamic object-oriented programming language |
US8108649B2 (en) | 2008-06-13 | 2012-01-31 | International Business Machines Corporation | Method of memory management for server-side scripting language runtime system |
US8631051B2 (en) | 2008-09-22 | 2014-01-14 | Filip Pizlo | Hybrid fragmenting real time garbage collection |
US8370822B2 (en) | 2008-11-20 | 2013-02-05 | Apple Inc. | Compiling techniques for providing limited accuracy and enhanced performance granularity |
US20110138373A1 (en) | 2009-12-08 | 2011-06-09 | American National Laboratories, Inc. | Method and apparatus for globally optimizing instruction code |
US9195486B2 (en) | 2010-07-30 | 2015-11-24 | Apple Inc. | Observation and analysis based code optimization |
JP5466601B2 (ja) | 2010-08-31 | 2014-04-09 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コード生成方法、システム及びプログラム |
US9009726B2 (en) | 2010-12-10 | 2015-04-14 | Microsoft Technology Licensing, Llc | Deterministic sharing of data among concurrent tasks using pre-defined deterministic conflict resolution policies |
US8819649B2 (en) | 2011-09-09 | 2014-08-26 | Microsoft Corporation | Profile guided just-in-time (JIT) compiler and byte code generation |
US8972952B2 (en) | 2012-02-03 | 2015-03-03 | Apple Inc. | Tracer based runtime optimization for dynamic programming languages |
-
2013
- 2013-12-04 US US14/096,912 patent/US9251071B2/en active Active
-
2014
- 2014-03-31 US US14/231,464 patent/US9501409B2/en active Active
- 2014-05-16 US US14/280,377 patent/US9672152B2/en active Active
- 2014-08-22 WO PCT/US2014/052286 patent/WO2015031192A1/en active Application Filing
- 2014-08-22 EP EP14759420.4A patent/EP3039535B1/en active Active
- 2014-08-22 KR KR1020167005435A patent/KR101778479B1/ko active IP Right Grant
- 2014-08-22 KR KR1020167005494A patent/KR101769260B1/ko active IP Right Grant
- 2014-08-22 WO PCT/US2014/052289 patent/WO2015031193A1/en active Application Filing
- 2014-08-22 CN CN201480047215.7A patent/CN105493041B/zh active Active
- 2014-08-22 EP EP14759421.2A patent/EP3039536B1/en active Active
- 2014-08-22 CN CN201480047216.1A patent/CN105493042B/zh active Active
- 2014-08-25 CN CN201480047213.8A patent/CN105493040B/zh active Active
- 2014-08-25 EP EP14762164.3A patent/EP3039537B1/en active Active
- 2014-08-25 KR KR1020167005489A patent/KR101872625B1/ko active IP Right Grant
- 2014-08-25 WO PCT/US2014/052581 patent/WO2015031286A1/en active Application Filing
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0806725A2 (en) * | 1996-05-07 | 1997-11-12 | Sun Microsystems, Inc. | Method and apparatus for easy insertion of assembler code for optimization |
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
Non-Patent Citations (1)
Title |
---|
"TypeCastor: Demystify Dynamic Typing of JavaScript Applications";Shisheng Li等;《PROCEEDINGS OF THE 6TH INTERNATIONAL CONFERENCE ON HIGH PERFORMANCE AND EMBEDDED ARCHITECTURES AND COMPILERS》;20111231;摘要、第1-7.4部分,图1-4 |
Also Published As
Publication number | Publication date |
---|---|
KR101778479B1 (ko) | 2017-09-26 |
KR20160040257A (ko) | 2016-04-12 |
CN105493040B (zh) | 2019-09-20 |
EP3039535B1 (en) | 2022-05-04 |
WO2015031286A1 (en) | 2015-03-05 |
WO2015031193A1 (en) | 2015-03-05 |
US9251071B2 (en) | 2016-02-02 |
KR20160038044A (ko) | 2016-04-06 |
KR101872625B1 (ko) | 2018-08-02 |
US20150067267A1 (en) | 2015-03-05 |
EP3039535A1 (en) | 2016-07-06 |
CN105493042A (zh) | 2016-04-13 |
US20150067658A1 (en) | 2015-03-05 |
KR101769260B1 (ko) | 2017-08-17 |
EP3039536A1 (en) | 2016-07-06 |
EP3039537A1 (en) | 2016-07-06 |
US20150067639A1 (en) | 2015-03-05 |
US9672152B2 (en) | 2017-06-06 |
EP3039537B1 (en) | 2022-04-20 |
CN105493041A (zh) | 2016-04-13 |
EP3039536B1 (en) | 2022-04-20 |
KR20160040254A (ko) | 2016-04-12 |
US9501409B2 (en) | 2016-11-22 |
CN105493042B (zh) | 2019-09-10 |
CN105493040A (zh) | 2016-04-13 |
WO2015031192A1 (en) | 2015-03-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105493041B (zh) | 在访问动态类型化对象过程中的并发内联高速缓存优化 | |
Pinto et al. | A comprehensive study on the energy efficiency of java’s thread-safe collections | |
US6721944B2 (en) | Marking memory elements based upon usage of accessed information during speculative execution | |
Schäfer et al. | Refactoring Java programs for flexible locking | |
WO2000070450A1 (en) | Supporting speculative execution by selectively versioning memory updates | |
KR20040094888A (ko) | 단일 스레드 응용을 지원하기 위한 시간-멀티플렉스된스펙큘레이티브 멀티 스레딩 | |
Fulton et al. | Compilation techniques for real-time Java programs | |
Batson | Program behavior at the symbolic level | |
Mohamedin et al. | ByteSTM: Virtual machine-level Java software transactional memory | |
Pereira et al. | Study of hardware transactional memory characteristics and serialization policies on Haswell | |
Wu et al. | Containers on the parallelization of general-purpose Java programs | |
Scott et al. | Architectural Background | |
Wood | Software and Hardware Support for Data-Race Exceptions | |
Choi | HW-SW co-design techniques for modern programming languages | |
Datta | Just-in-time compilation of SQL queries with OMR JitBuilder | |
Devietti | Deterministic execution for arbitrary multithreaded programs | |
Brownhill et al. | Percolation scheduling for non-VLIW machines | |
ARIE et al. | Parallelization of Dynamic Languages: Synchronizing Built-in Collections | |
Ahn | Software and architecture support for the bulk multicore | |
Schröder | Using Modern Synchroniza on Mechanisms in Databases | |
Stipić | Techniques for improving the performance of software transactional memory | |
Zhang et al. | Memory System Performance of a Database in a Shared-Memory Multiprocessor |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |